Entity Framework. Можно и рекомендуется использовать транзакцию в контексте несколько раз. - PullRequest
0 голосов
/ 17 мая 2019

например. У меня есть такой код

using (AccountingEntities ent = new AccountingEntities())
{
    //just to read record
    var recs = ent.Payments.Where(pp => pp.PaymentId == 123);

    foreach (p in recs)
    {
        if (p.Status == 1)
        {
            using (var dbContextTransaction = ent.Database.BeginTransaction())
            {
                var someotherrecs = ent.SomeTable.Where(s => s.PaymentId == 456);
                foreach (var rec in someotherrecs)
                {
                    rec.Status = 2;
                }
                ent.SaveChanges();
                dbContextTransaction.Commit();
            }
        }
    }
}

Если мне не нужно менять записи, я буду избегать запуска транзакции, возможно, в 90% случаев. Можно ли делать такие вещи (запуск и завершение нескольких транзакций в одном контексте)?

1 Ответ

1 голос
/ 17 мая 2019

Как отметил @Ivan Stoev в комментарии, вам здесь вообще не нужна транзакция.Прочитайте документацию https://docs.microsoft.com/ru-ru/dotnet/api/system.data.objects.objectcontext.savechanges?view=netframework-4.8

и найдите там:

SaveChanges работает в транзакции.

Итак, EF имеет средство отслеживания изменений, которое отслеживает любые изменения вюридические лица.Когда вы выполняете SaveChanges, то в одной транзакции все изменения будут зафиксированы или отменены в случае исключения.

Таким образом, ваш код может выглядеть следующим образом:

using (AccountingEntities ent = new AccountingEntities())
{
    //just to read record
    var recs = ent.Payments.Where(pp => pp.PaymentId == 123);

    foreach (p in recs)
    {
        if (p.Status == 1)
        {
                var someotherrecs = ent.SomeTable.Where(s => s.PaymentId == 456);
                foreach (var rec in someotherrecs)
                {
                    rec.Status = 2;
                }
                ent.SaveChanges();

        }
    }
}
...