• 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中操作简单方便。

  • 相关阅读:
    IDEA Inspections详解
    IDEA 阿里编码规范插件
    IDEA Save Actions插件
    IDEA Lombok插件
    设计模式-简单工厂模式与工厂模式
    DAO设计模式
    Jcrop+strut2+jsp实现图片剪切
    Spring的Bean的作用域
    Spring的事务机制
    windows 下 Redis 主从 读写分离
  • 原文地址:https://www.cnblogs.com/sunShineJing/p/4615456.html
Copyright © 2020-2023  润新知