EF6在内部方法中使用事务

时间:2019-05-15 08:39:56

标签: entity-framework transactions entity-framework-6 transactional

我已经看到许多关于使用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范围,并且不关心这个范围。那我该如何工作呢?

1 个答案:

答案 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没有引发异常,所以回滚从未发生。你能检查一下吗?