Entity Framework. Можно и рекомендуется использовать транзакцию в контексте несколько раз.

Например, у меня есть такой код

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 ответ


Как отметил @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();

        }
    }
}

Есть идеи?

10000