上篇文章介绍了EF的CodeFirst的使用,以及CodeFirst的一些坑。这篇文章主要介绍EF对事务和SQL语句,以及存储过程的支持。
事务的概念
事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这种特性特别使用于一些比较特殊的场景,比如买票,取钱等。
事务以及SQL语句的使用
EF除了可以从代码映射数据库中的表,或者从数据库中的表映射到代码,模型等,为我们更好的敲代码提供了遍历,但是不仅如此,EF还支持原生态的sql语句以及存储过程等,则又为我们提供了另一种编程的方式,就像使用ADO.NET一样。
我们在控制台输入这样一段代码:
我们使用EF为我们提供的事务的对象DbContextTransactioncontext.Database.BeginTransaction()则句话是指明我们已经开启了事务,另外在介绍几个主要的函数一个是ExecuteSqlCommand(),这个函数一般都是用来作增删改的,它的返回值是一个int类型的参数,另外一个就是SqlQuery(),这个函数一般都是用来作查询用的,它的返回值是DbRawSqlQuery类型的直译就是“数据行的数据集”,我们可以强行将其转换成ToList类型,或者IEnumerable类型,commit()是指我们要提交事务了。前面说,事务具有要不全部执行,要不全部不执行的特性,而这个就是由Rollback()这个函数来控制的,如果事务执行失败,则全部回滚,上面执行的都要回退的没有执行前的状态。
执行存储过程
首先我们在数据库中新建存储过程
然后我们在修改控制台的代码,让EF去执行存储过程。这里需要注意的是一定要带上参数 @ID 这里@ID 也可以写成小写的 ,比如:“@id”,“@Id”,"@iD"都是可以的。如果要执行增删改的话,那么使用ExecuteSqlCommand()函数就可以了,用法类似,就不过多的介绍了。
[转载](https://www.cnblogs.com/jearay/p/5543045.html)
TransactionScope的使用
TransactionScope也是事务。
首先添加程序集的引用
然后引入命名空间 using System.Transactions
然后我们来敲代码。我们打断点发现,当程序运行到transactionscope.Complete()这句的时候,虽然result的值返回的是1,代表执行成功,但是我们查询数据库时,发现数据并没有插入到数据库中,当我们完全运行完程序的时候,我们检查数据库才发现数据库被插入了一条新的数据。这点说明一下就是,当在数据中使用context.SaveChanges()的时候,EF并不会立即去执行,返回的result,也只是对上面需要执行的语句的检查,没有语法错误则返回1,程序将没有错误的需要提交的操作挂起,当遇到Complete()函数的时候,程序会将挂起的操作全部提交到数据库中,如果有错误,则会全部回滚,反之则将新的数据更新到数据库中。