我正在使用 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
?
由于
答案 0 :(得分:3)
您需要在范围对象上调用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();
}
}
答案 1 :(得分:2)
这应该为您解释 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/
编辑:根据szer的要求。
他们从链接的关键点是:
"如果你调用SaveChanges()或SaveChanges(true),EF只会假设如果它的工作完成正常,一切正常,所以它会丢弃它一直在跟踪的更改,并等待新的更改"
答案 2 :(得分:2)
像Marc解释的那样,您需要回滚TransactionScope
,而不是回滚EF上下文事务。 TransactionScope
创建一个操作可以登记的环境事务。所以你在这里做的是创建一个包装多个事务的事务,并且可以一次提交或回滚所有事务。
您的代码中发生了什么: