Kerangka Entitas. Apakah mungkin dan direkomendasikan untuk menggunakan transaksi dalam konteks beberapa kali.?

Misalnya. Saya punya kode seperti itu

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();
            }
        }
    }
}

Jika saya tidak perlu mengubah catatan, saya akan menghindari memulai transaksi, mungkin dalam 90% dari semua kasus. Bolehkah melakukan hal-hal seperti itu (memulai dan menyelesaikan banyak transaksi dalam satu konteks)?


person alekoo73    schedule 17.05.2019    source sumber
comment
SaveChanges melakukannya secara otomatis untuk Anda.   -  person Ivan Stoev    schedule 17.05.2019
comment
@IvanStoev Tapi apakah itu akan menghasilkan pengecualian, atau ketinggalan menulis perubahan?   -  person alekoo73    schedule 17.05.2019
comment
Masuk akal (mungkin) jika Anda memiliki beberapa SaveChanges panggilan dalam satu transaksi. Terkadang hal itu tidak bisa dihindari.   -  person Gert Arnold    schedule 17.05.2019


Jawaban (1)


Seperti yang disebutkan @Ivan Stoev dalam komentar, Anda tidak memerlukan transaksi sama sekali di sini. Baca dokumentasi https://docs.microsoft.com/ru-ru/dotnet/api/system.data.objects.objectcontext.savechanges?view=netframework-4.8

dan temukan di sana:

SaveChanges beroperasi dalam suatu transaksi.

Jadi, EF memiliki pelacak perubahan yang melacak setiap perubahan pada entitas. Saat Anda melakukan SaveChanges maka dalam satu transaksi semua perubahan akan diterapkan atau dibatalkan jika ada pengecualian.

Jadi kode Anda mungkin terlihat seperti:

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