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% ของทุกกรณี เป็นไปได้ไหมที่จะทำสิ่งดังกล่าว (เริ่มต้นและสิ้นสุดธุรกรรมหลายรายการภายในบริบทเดียว)


person alekoo73    schedule 17.05.2019    source แหล่งที่มา
comment
SaveChanges ทำสิ่งนั้นให้คุณโดยอัตโนมัติ   -  person Ivan Stoev    schedule 17.05.2019
comment
@IvanStoev แต่จะสร้างข้อยกเว้นหรือพลาดที่จะเขียนการเปลี่ยนแปลงหรือไม่   -  person alekoo73    schedule 17.05.2019
comment
มันคงจะสมเหตุสมผล (อาจจะ) หากคุณมีการเรียก SaveChanges หลายครั้งในธุรกรรมเดียว บางครั้งก็หลีกเลี่ยงไม่ได้   -  person Gert Arnold    schedule 17.05.2019


คำตอบ (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();

        }
    }
}
person Sergey M    schedule 17.05.2019