EntityFramework用法探索(八)事务处理

简介:

使用前文中描述的Retail示例,在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<DomainModels.Customer, Customer>(customer1);
 2       Customer entity2 = Mapper.Map<DomainModels.Customer, Customer>(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<DomainModels.Customer, Customer>(customer1);
 5           Customer entity2 = Mapper.Map<DomainModels.Customer, Customer>(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,如需转载请自行联系原作者


目录
相关文章
|
Ubuntu Linux 开发工具
Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
588 0
|
存储 JavaScript Linux
Crontab详解
Crontab详解
408 0
Crontab详解
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
504 12
|
9月前
|
人工智能 UED
VersaGen:生成式 AI 代理,基于 Stable Diffusion 生成图像,专注于控制一至多个视觉主体等生成细节
VersaGen 是一款生成式 AI 代理,专注于文本到图像合成中的视觉控制能力,支持多种视觉控制类型,并通过优化策略提升图像生成质量和用户体验。
179 8
VersaGen:生成式 AI 代理,基于 Stable Diffusion 生成图像,专注于控制一至多个视觉主体等生成细节
|
10月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
323 19
|
算法 Python
Python3注释:让你的代码更清晰更易读
Python3注释:让你的代码更清晰更易读
185 0
|
12月前
|
人工智能 安全 决策智能
OpenAI推出实验性“Swarm”框架,引发关于AI驱动自动化的争论
OpenAI推出实验性“Swarm”框架,引发关于AI驱动自动化的争论
247 14
|
存储 人工智能 安全
AIGC会给企业带来哪些安全合规挑战?
【1月更文挑战第18天】AIGC会给企业带来哪些安全合规挑战?
305 1
AIGC会给企业带来哪些安全合规挑战?
|
12月前
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
249 5