注意一点:

在EF中使用事物后,对于一个新增的model,在saveChanges后,可以得到该实体的自增ID,但在提交事物之前,

该数据并没有真正的新增到DB中,但此时可以得到model新增的自增ID,程序中可以使用,很方便!

例如下面的series实体在新增时,下面新增level时就可以直接使用,但此时的series并没有真正的新增到db中。

/// <summary>
        /// 导入汽车维护数据
        /// </summary>
        /// <param name="BrandName"></param>
        /// <returns></returns>
        public static Result ImportVehicleData(string strDataTable)
        {
            DataTable dt = JsonHelper.Deserialize<DataTable>(strDataTable);
            if (dt != null)
            {
                using (Entities db = new Entities())
                {
                    using (TransactionScope transaction = new TransactionScope())
                    {
                        try
                        {
                            var brandList = db.TL_Sys_VehicleBrand.ToList();
                            var seriesList = db.TL_Sys_VehicleSeries.ToList();
                            var levelList = db.TL_Sys_VehicleLevel.ToList();

string brandName = "";
                            string seriesName = "";
                            string levelName = "";
                            bool isInterest = true;
                            bool isDefault = true;

TL_Sys_VehicleBrand brand = new TL_Sys_VehicleBrand();
                            TL_Sys_VehicleSeries series = new TL_Sys_VehicleSeries();
                            bool isSave = false;
                            foreach (DataRow dr in dt.Rows)
                            {
                                brandName = dr[0].ToString().Trim();
                                isInterest = dr[3].ToString().Trim() == "否" ? false : true;
                                isDefault = dr[4].ToString().Trim() == "否" ? false : true;
                                brand = brandList.Where(p => p.Name == brandName).FirstOrDefault();

seriesName = dr[1].ToString().Trim();
                                series = seriesList.Where(p => p.CarBrandID == brand.ID && p.Name.Trim().Replace(" ", "") == seriesName.Trim().Replace(" ", "")).FirstOrDefault();
                                if (series == null)
                                {
                                    series = new TL_Sys_VehicleSeries();
                                    //新增车辆车系
                                    series.CarBrandID = brand.ID;
                                    series.Name = seriesName;
                                    series.Code = GetVehicleSeriesNextCode(brand, seriesList);
                                    series.IsInterest = isInterest;
                                    series.IsDefault = isDefault;
                                    db.TL_Sys_VehicleSeries.Add(series);
                                    db.SaveChanges();
                                    seriesList.Add(series);
                                }

levelName = dr[2].ToString().Trim();
                                if (!string.IsNullOrWhiteSpace(levelName) && series != null && series.ID > 0)
                                {
                                    var level = levelList.Where(p => p.CarLineID == series.ID && p.Name.Trim().Replace(" ", "") == levelName.Trim().Replace(" ", "")).FirstOrDefault();
                                    if (level == null)
                                    {
                                        level = new TL_Sys_VehicleLevel();
                                        //新增车辆车型
                                        level.CarLineID = series.ID;
                                        level.Name = levelName;
                                        level.Code = GetVehicleLevelNextCode(series, levelList);
                                        level.IsInterest = isInterest;
                                        level.IsDefault = isDefault;
                                        db.TL_Sys_VehicleLevel.Add(level);
                                        //db.SaveChanges();
                                        isSave = true;

levelList.Add(level);
                                    }
                                }
                            }
                            //如果有新增的车型,就一起保存数据库
                            if (isSave)
                            {
                                db.SaveChanges();
                            }

transaction.Complete();
                            return new Result(true, "导入成功");
                        }
                        catch(Exception er)
                        {
                            transaction.Dispose();
                            return new Result(false, "导入发生异常," + er.ToString());
                        }
                    }
                }
            }
            return new Result(false, "导入汽车信息不能为空");
        }

EF中的transaction的使用范例的更多相关文章

  1. 在EF中正确的使用事务

    1.EF中使用事务: using (TransactionScope tran = new TransactionScope()) { try { using(var _context = new D ...

  2. EF Core利用Transaction对数据进行回滚保护

    What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...

  3. Entity Framework入门教程(19)---EF中使用事务

    EF中使用事务 这节介绍EF6中事务的使用.EF core中事务的使用方式和EF6中一模一样. 1.EF中的默认的事务 默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然 ...

  4. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  5. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  6. EF中扩展出Between操作符 (修订版)

    随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...

  7. 如何在EF中实现left join(左联接)查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  8. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  9. EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!

    回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...

随机推荐

  1. 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩

    原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...

  2. 对于Netty的十一个疑问(转)

    [说明]本文原载于码农 IO(manong.io)官方微信 developerWorks,转载.引用请注明出处及作者. 1.Netty 是什么? Netty 是一个基于 JAVA NIO 类库的异步通 ...

  3. Android - 分享内容

    Android程序一个很重要地特性是他们可以相互通讯和交互.为什么要重新开发那些不是你程序的核心而且其他程序已经有的功能呢? 这里将要介绍一些使用Intent API和ActionProvider对象 ...

  4. 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

    原文:[原创]构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测C ...

  5. 软测试是一个烂摊子?NO——【软测试】

    软测试是一个烂摊子权?我开始也是这么认为的.这充分证明,.我并没有考虑,整个合并没有类似的项目. 前几天跟慕夏交流了怎样做总结,听完她讲的,我開始学着为细节的知识点找联系. 只是今天跟老师一交流,才发 ...

  6. 系列三VisualSvn Server

    原文:系列三VisualSvn Server VisualSvn Server介绍 1 .VisualSvn Server  VisualSvn Server是免费的,而VisualSvn是收费的.V ...

  7. 聪明的kk

    聪明的kk 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘.体现出本 ...

  8. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  9. 高效C++规划

    推荐写C++代码风格.看似easy.坚持不易,且写且珍惜! --陈国林 1. 版本号和版本号声明 版本号和版本号文件声明位于头文件和定义文件的开头,主要内容 (1)版本号信息 (2)文件名.标识符.摘 ...

  10. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...