博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework用法探索(八)事务处理
阅读量:7209 次
发布时间:2019-06-29

本文共 2802 字,大约阅读时间需要 9 分钟。

使用,在Customer对象的Mapping中设置Name属性:

1       this.Property(t => t.Name)2           .IsRequired()3           .HasMaxLength(256);

要求该属性不能为空,并且长度不超过256。

我们构造一个有效的Customer对象,再构造一个无效的Name属性为空的对象。

1       DomainModels.Customer customer1 = new DomainModels.Customer() 2       { 3         Name = "Dennis Gao", 4         Address = "Beijing", 5         Phone = "18888888888", 6       }; 7       DomainModels.Customer customer2 = new DomainModels.Customer() 8       { 9         //Name = "Degang Guo", // 创造一个无效的对象,此处客户名称不能为空10         Address = "Beijing",11         Phone = "16666666666",12       };

我们使用如下代码添加Customer对象数据到数据库中,

1       Customer entity1 = Mapper.Map
(customer1); 2 Customer entity2 = Mapper.Map
(customer2); 3 4 using (RetailEntities context = new RetailEntities()) 5 { 6 context.Customers.Add(entity1); 7 context.Customers.Add(entity2); 8 context.SaveChanges(); // 提交时将抛出异常 9 10 customer1.Id = entity1.Id;11 customer2.Id = entity2.Id;12 }13 14 Console.WriteLine(customer1);15 Console.WriteLine(customer2);

得到结果:

EntityFramework已经明确的告诉我们某Entity验证失败。此时查询数据库,两条记录均不存在。EntityFramework自带的事务已经帮助回滚了操作。

现在我们修改下程序,改为提交两次:

1       try 2       { 3         using (RetailEntities context = new RetailEntities()) 4         { 5           context.Customers.Add(entity1); 6           context.SaveChanges(); // 顺利执行 7           context.Customers.Add(entity2); 8           context.SaveChanges(); // 提交时将抛出异常 9 10           customer1.Id = entity1.Id;11           customer2.Id = entity2.Id;12         }13       }14       catch (Exception ex)15       {16         Console.WriteLine(FlattenException(ex));17       }

此时得到结果:

通过查询,可以确定,第一条数据已经被成功保存。

然后我们修改代码,增加TransactionScope,

1         using (var transactionScope = new TransactionScope( 2           TransactionScopeOption.RequiresNew)) 3         { 4           Customer entity1 = Mapper.Map
(customer1); 5 Customer entity2 = Mapper.Map
(customer2); 6 7 using (RetailEntities context = new RetailEntities()) 8 { 9 context.Customers.Add(entity1);10 context.SaveChanges(); // 顺利提交11 context.Customers.Add(entity2);12 context.SaveChanges(); // 提交时将抛出异常13 14 customer1.Id = entity1.Id;15 customer2.Id = entity2.Id;16 }17 18 transactionScope.Complete();19 }20 }21 catch (Exception ex)22 {23 Console.WriteLine(FlattenException(ex));24 }

此时,仍然在第二个SaveChanges()处抛出异常,但第一个SaveChanges()的提交也被回滚了。

证明事务Scope起到了作用。

完整代码和索引

EntityFramework用法探索系列

本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/06/09/entityframework_usage_transaction_scope.html,如需转载请自行联系原作者

你可能感兴趣的文章
VirtualBox虚拟机增加CentOS根目录容量 LVM扩容
查看>>
Nginx 和 PHP 的两种部署方式比较
查看>>
纪录2b,和诡异,
查看>>
appendFormat
查看>>
centos下安装升级python到python3.5
查看>>
数据结构实验之排序二:交换排序
查看>>
【视频教程】Mini6410/Tiny6410的国嵌视频教程光盘,总共五张
查看>>
桶排序
查看>>
追MM与Java的23种设计模式[转]
查看>>
线程 2
查看>>
[C#][控件]文本类控件
查看>>
[Multimedia][MPEG2]MPEG-2系统原理
查看>>
背包九讲(转)
查看>>
HDU5988 Coding Contest(浮点费用流)
查看>>
css3文字溢出显示省略号
查看>>
Rugy 茶余饭后
查看>>
Linux shell中运行命令后加上字符“&”的作用
查看>>
MySQL存储引擎对比
查看>>
[Android Pro] AsyncTaskLoader vs AsyncTask
查看>>
[Linux] du-查看文件夹大小-并按大小进行排序
查看>>