EF6 используя транзакцию во внутренних методах - PullRequest
1 голос
/ 15 мая 2019

Я видел много сообщений об использовании транзакций 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 голосов
/ 15 мая 2019

Я сделал быструю проверку в 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 этого не сделаливыбросить исключение, чтобы отката не произошло.Не могли бы вы проверить?

...