EF中的transaction的使用范例
注意一点:
在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的使用范例的更多相关文章
- 在EF中正确的使用事务
1.EF中使用事务: using (TransactionScope tran = new TransactionScope()) { try { using(var _context = new D ...
- EF Core利用Transaction对数据进行回滚保护
What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...
- Entity Framework入门教程(19)---EF中使用事务
EF中使用事务 这节介绍EF6中事务的使用.EF core中事务的使用方式和EF6中一模一样. 1.EF中的默认的事务 默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- EF中扩展出Between操作符 (修订版)
随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...
- 如何在EF中实现left join(左联接)查询
在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!
回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...
随机推荐
- sql中 in 、not in 、exists、not exists 使用方法和区别
% 的一类. NOT IN:通过 NOT IN keyword引入的子查询也返回一列零值或很多其它值. 以下查询查找没有出版过商业书籍的出版商的名称. SELECT pub_name FROM pub ...
- telnet模拟http訪问
HTTP协议经常使用的无非就那么几个命令 GET HEAD PUT POST 此处简单说下http的GET和HEAD 举两个简单的样例: GET的样例 telnet serverip 80 GET h ...
- HDU 4284 状压dp+spfa
题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...
- IMP-00013 目前只有 DBA 其他导入能力 DBA 导出的文件
--实例演示 ---system用户导出 C:\Users\ZML>exp system/zml file='D:\zml.dmp' log = 'D:\zml.log' tables = (z ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- Apache HTTP Server 与 Tomcat 的三种连接方式介绍(转)
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...
- HDU 1698 Just a Hook (段树更新间隔)
Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing for m ...
- 360的IM可能会是什么样?
尽管周鸿祎不止一次的说过,它不会进入IM领域,可是在360和QQ大战之后,很多用户 在卸载了QQ,寻找替代的IM工具的时候,发现他们非常难找到合适的替代IM工具,由于 好友非常难迁移.在用户的强烈 呼 ...
- 为什么windows dos和Linux shell有这样的差别??
Windows dos随着impdp导入数据库: impdp "sys/password@ip:1521/sidname as sysdba" directory=dbdir du ...
- java中三种常见内存溢出错误的处理方法(good)
相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决j ...