EntityFramework, TransactionScope and SaveChange
本文关键字:SaveChange and TransactionScope EntityFramework | 更新日期: 2023-09-27 18:37:09
我正在使用EntityFramework开发一个c#项目,最后一位开发人员写道:
using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
try
{
//... do somehting
context.SaveChanges();
//... do some other work
context.SaveChanges();
scope.Complete();
}
catch (Exception ex)
{
context.RollbackChanges();
scope.Complete();
}
}
我不明白他为什么要使用TransactionScope
.我试图在 2 SaveChanges
之间抛出异常,但它没有回滚第一次调用修改。
为什么要使用TransactionScope
?
谢谢
这应该为您解释 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/
编辑:根据szer的要求。
他们从链接中得出的关键要点是:
"如果调用 SaveChanges() 或 SaveChanges(true),EF 只是假设如果它的工作完成正常,则一切正常,因此它将放弃它一直在跟踪的更改,并等待新的更改。
您需要在 scope 对象上调用 Rollback()
方法。若要创建作用域,请调用 context.Database.BeginTransaction()
:
using (var scope = context.Database.BeginTransaction())
{
try
{
// do some stuff
context.SaveChanges();
// do other stuff
context.SaveChanges();
scope.Commit();
}
catch (Exception)
{
scope.Rollback();
}
}
就像 Marc 解释的那样,您需要回滚TransactionScope
,而不是 EF 上下文事务。 TransactionScope
创建操作可以登记的环境事务。因此,您在这里要做的是创建一个事务,该事务包装多个事务,并且可以一次提交或回滚所有事务。
代码中发生的事情是这样的:
- 您正在提交查询 1(使用 SaveChanges 调用)。
- 您正在提交查询 2(使用 SaveChanges 调用)。
- 发生错误。
- 要回滚最新事务(查询 2)。请注意,查询 1 仍已提交。
- 您正在提交环境事务,"保存"结果。这意味着最终结果是查询 1 已提交,查询 2 已回滚。