Например, у меня есть такой код
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();
}
}
}