【问题标题】:EF6 using transaction in inner methodsEF6 在内部方法中使用事务
【发布时间】:2019-05-15 08:39:56
【问题描述】:

我看过很多关于使用 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 范围,并不关心这个。那么我怎样才能让它发挥作用呢?

【问题讨论】:

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


    【解决方案1】:

    我在 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 没有抛出异常,所以回滚从未发生。你能查一下吗?

    【讨论】:

    • 您好,很遗憾您给出的答案正是我在其他地方找到的。我从主块调用带有 savechanges() 的函数。您展示的是主块内的 savechanges() 。这样我就知道该怎么做了。
    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 2011-11-06
    • 2016-09-09
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多