我已经看到许多关于使用ef6事务的帖子,但是所有SaveChanges()
都在同一块中。
我想要的是使用transaction
并在一个块内调用多个函数,每个函数都有SaveChanges()
但属于主transaction
块。
我已经尝试过如下代码:
using(var transaction = context.Database.BeginTransaction())
{
try
{
doSomething(); //Has SaveChanges() and also sub functions with also SaveChanges()
doSomethingElse(); //Same as before
}
catch (Exception exp)
{
transaction.Rollback();
}
transaction.Commit();
}
发生的事情是transaction.Rollback()
根本不执行任何操作。
我假设内部函数有自己的transaction
范围,并且不关心这个范围。那我该如何工作呢?
答案 0 :(得分:0)
我在LinqPad中进行了快速检查:
void Main()
{
using (var transaction = Database.BeginTransaction())
{
var z = z_pdd_log.First(p => p.id == 100001);
Console.WriteLine(z.result);
z.result = "TEST";
this.SaveChanges();
Console.WriteLine(z.result);
transaction.Rollback();
DetachAll();
z = z_pdd_log.First(p => p.id == 100001);
Console.WriteLine(z.result);
}
}
public void DetachAll()
{
foreach (DbEntityEntry dbEntityEntry in ChangeTracker.Entries())
{
if (dbEntityEntry.Entity != null)
{
dbEntityEntry.State = System.Data.Entity.EntityState.Detached;
}
}
}
结果为:
OK
TEST
OK
回滚有效。
也许您的doSomthing-Methods没有引发异常,所以回滚从未发生。你能检查一下吗?