Entity Framework的事务提交

一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。事物的Commit是执行了你的方法进行了数据库的提交,之前的sava都是放在缓存中并没有执行到数据库。

  • 1. 使用TransactionScope

这个写法最像ado.net的事务提交。需要引用System.Transactions命名空间。

var invoiceDetailOriginal = InvoiceDetailService.Query(m => m.DetailID == 86).FirstOrDefault();
            using (TransactionScope transaction = new TransactionScope())
            {
                try
                {
                    List<BL_Invoice> invoiceLst = new List<BL_Invoice>();
                    List<BL_InvoiceDetail> detailLst = new List<BL_InvoiceDetail>();
                    var lst = InvoiceService.Query(m => m.ID > 49).ToList();
                    for (int n = 0; n < 3; n++)
                    {
                        BL_Invoice i = new BL_Invoice()
                        {
                            IsWD = lst[n].IsWD,
                            IsAzure = lst[n].IsAzure,
                            InvoiceNumber = lst[n].InvoiceNumber,
                            InvoiceDate = DateTime.Now,
                            BITTYPE = lst[n].BITTYPE,
                            BPexternalID = lst[n].BPexternalID,
                            CAexternalID = lst[n].CAexternalID,
                            Amount = lst[n].Amount,
                            IsMETHODSynced = false,
                            METHOD_INCC = (n == 1) ? "XXXX" : "P",
                            CreatedDate = DateTime.Now
                        };

                        BL_InvoiceDetail d = new BL_InvoiceDetail()
                        {
                            BL_Invoice = i,
                            BITREF32 = invoiceDetailOriginal.BITREF32,
                            MSSKU = (n == 1) ? "存二十个汉字;存二十个汉字;存二十个汉字;存二十个汉字;存二十个汉字。" : invoiceDetailOriginal.MSSKU,
                            Amount = invoiceDetailOriginal.Amount,
                            Tax = invoiceDetailOriginal.Tax,
                            DeferralAmount = invoiceDetailOriginal.DeferralAmount,
                            BITDATE_FROM = invoiceDetailOriginal.BITDATE_FROM,
                            BITDATE_TO = invoiceDetailOriginal.BITDATE_TO,
                            CreatedDate = DateTime.Now
                        };
                        InvoiceService.Add(i);
                        InvoiceDetailService.Add(d);     //到这一步出错,然后看添加invoice也没有添加上。 这就是事务的作用。当然entity的savaChangge() 也可以看做是一个事务。
                        transaction.Complete();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    transaction.Dispose();
                }
  •  2. SaveChangges() 和UnitOfWork.Commit()

插入一两个相关的list。list中有一条出错,整个事务回滚。利用的 reponsitory的 IUnitOfWork。

List<BL_Invoice> invoiceLst = new List<BL_Invoice>();
            List<BL_InvoiceDetail> detailLst = new List<BL_InvoiceDetail>();
            var lst = InvoiceService.Query(m => m.ID > 49).ToList();
            for (int n = 0; n < lst.Count();n++)
            {
                BL_Invoice i = new BL_Invoice()
                {
                    IsWD = lst[n].IsWD,
                    IsAzure = lst[n].IsAzure,
                    InvoiceNumber = lst[n].InvoiceNumber,
                    InvoiceDate = DateTime.Now,
                    BITTYPE = lst[n].BITTYPE,
                    BPexternalID = lst[n].BPexternalID,
                    CAexternalID = lst[n].CAexternalID,
                    Amount = lst[n].Amount,
                    IsMETHODSynced = false,
                    METHOD_INCC =(n==1)?"XXX":"P",
                    CreatedDate = DateTime.Now
                };
                invoiceLst.Add(i);
                var invoiceDetailOriginal = InvoiceDetailService.Query(m => m.DetailID == 86).FirstOrDefault();//lst[n].BL_InvoiceDetail.FirstOrDefault();
                BL_InvoiceDetail d = new BL_InvoiceDetail()
                {
                    BL_Invoice = i,
                    BITREF32 = invoiceDetailOriginal.BITREF32,
                    MSSKU = (n == 1) ? "存二十个汉字;存二十个汉字;存二十个汉字;存二十个汉字;存二十个汉字。" : invoiceDetailOriginal.MSSKU,
                    Amount = invoiceDetailOriginal.Amount,
                    Tax = invoiceDetailOriginal.Tax,
                    DeferralAmount = invoiceDetailOriginal.DeferralAmount,
                    BITDATE_FROM = invoiceDetailOriginal.BITDATE_FROM,
                    BITDATE_TO = invoiceDetailOriginal.BITDATE_TO,
                    CreatedDate = DateTime.Now
                };
                detailLst.Add(d);
            }
            InvoiceService.AddRange(invoiceLst, detailLst);

总体来说Entity Framework中的数据库操作无不体现着事务的关联性,毕竟这也是合理的要求。比ado.net中操作简单方便。

时间: 2024-08-27 04:44:18

Entity Framework的事务提交的相关文章

Entity Framework实现事务回滚

在使用Entity Framework为主从表添加数据,当一个表添加数据成功,另一个表添加数据失败,这时候就需要用到事务回滚. 比如有以下关系的2张表. 客户端使用TransactionScope类可以实现事务回滚. class Program { static void Main(string[] args) { try { using (TransactionScope ts = new TransactionScope()) { using (CountryDetailsEntities

Entity Framework 的事务 DbTransaction

事务代码实现如下: public static void Transaction() { myitEntities entity = null; DbTransaction tran = null; try { entity = new myitEntities(); entity.Connection.Open(); tran = entity.Connection.BeginTransaction(); Student st = entity.Student.FirstOrDefault(c

【C#】Entity Framework 增删改查和事务操作

1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否可空) var user = new User { Name = "bomo", Age = 21, Gender = "male" }; db.User.Add(user); db.SaveChanges(); 2.删除对象,删除只需要对象的主键 DbEntity d

在Entity Framework中使用事务

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 继续为想使用Entity Framework的朋友在前面探路,分享的东西虽然技术含量不高,但都是经过实践检验的. 在Entity Framework中使用事务很简单,将操作放在TransactionScope中,并通过Complete()方法提

Entity framework调用存储过程,事务问题

问题描述 Entity framework 调用存储过程,使用database first生成的方法和db.database.ExecuteSqlCommand调用,都产生异常:无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 该伙伴事务管理器已经禁止了它对远程/网络事务的支持 问题原因 被调方法本身都启用了事务,而存储过程中包含了链接服务器和事务 解决方案 db.database.ExecuteSq

Entity Framework 学习

Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍... 7 Entity Framework 学习初级篇3-- LINQ TOEntities. 10 Entity Framework 学习初级篇4--EntitySQL. 17 Entity Framework 学习初级篇5--ObjectQ

Entity Framework教程(第二版)

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

Entity Framework 与 面向对象

说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述了在项目中用得比较多的通用的方法: 最后的项目迭代这次怎么迭代开发 现在有点晚了,我公司在山上,得赶着下山,没来得及审稿,所以有错误欢迎指正. 个人觉得有点赶,而且有点长,所以排列文本控制得不是很好,有待再继续补充或者修改. ======================分割线,专治强迫症,下面是半个

MVC5 Entity Framework学习之实现主要的CRUD功能

在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自己主动创建的CRUD(create, read, update, delete)代码进行改动. 注意:通常我们在控制器和数据訪问层之间创建一个抽象层来实现仓储模式.为了将注意力聚焦在怎样使用实体框架上.这里暂没有使用仓储模式. 在本篇文章中,要创建的web页面: watermark/2/text/aHR0cDovL