SORU
2 Mayıs 2009, CUMARTESİ


Varlık Çerçevesi - Kullanma İşlemleri veya SaveChanges(false) ve AcceptAllChanges()?

Ben soruşturma işlemleri ve görünen kendi başlarının çaresine bakıyorlar EF sürece geçtim false SaveChanges() ve Ara AcceptAllChanges() varsa hata:

SaveChanges(false);
// ...
AcceptAllChanges();

Eğer bir şeyler kötü giderse? ben geri dönme ya, benim yöntem kapsam dışına çıkmaz, işlem sona gerekmiyor mu?

İşlem yarısına atanmış olan herhangi bir indentiy sütunlar ne oluyor? Eğer başka birisi benim kötü gitmeden önce benim sonra bir kayıt ilave edilirse, o zaman bu kayıp bir Kimlik değeri olacak sanırım.

Herhangi bir nedenle benim kod TransactionScope standart sınıfı var mı acaba?

CEVAP
2 Mayıs 2009, CUMARTESİ


Varlık Çerçevesi ile zaman SaveChanges() en yeterlidir. Bu işlem oluşturur, ya da herhangi bir ortam hareket kaydeder ve bu işlem için gerekli tüm çalışmaları yapar.

Bazen olsa SaveChanges(false) AcceptAllChanges() eşleştirme yararlıdır.

Bunun için en kullanışlı yer iki farklı içerikler dağıtılmış bir işlem yapmak istediğiniz durumlar için uygundur.

I. e. böyle bir şey (kötü):

using (TransactionScope scope = new TransactionScope())
{
    //Do something with context1
    //Do something with context2

    //Save and discard changes
    context1.SaveChanges();

    //Save and discard changes
    context2.SaveChanges();

    //if we get here things are looking good.
    scope.Complete();
}

context1.SaveChanges() context2.SaveChanges() başarısız başarılı olursa, tüm dağıtılmış işlem iptal edildi. Ama ne yazık ki Varlık Çerçevesi zaten tekrar. bu yüzden context1, üzerinde değişiklikler atılır veya etkili hatası günlüğü.

Ama eğer kodunuzu şöyle değiştirirseniz:

using (TransactionScope scope = new TransactionScope())
{
    //Do something with context1
    //Do something with context2

    //Save Changes but don't discard yet
    context1.SaveChanges(false);

    //Save Changes but don't discard yet
    context2.SaveChanges(false);

    //if we get here things are looking good.
    scope.Complete();
    context1.AcceptAllChanges();
    context2.AcceptAllChanges();

}

Süre çağrısı SaveChanges(false) gönderir gerekli komutları için veritabanı, içerik kendisi değişmemiş, böylece tekrar gerekirse, ya da sen-ebilmek sorgulama ObjectStateManager eğer istersen.

Bu işlem aslında, her bağlamlarını yeniden çalışırken veya günlük ya da devlet tarafından telafi edebilirsiniz iptal eder demektir ObjectStateManager bir yere.

Daha fazlası için 18* blog post *bakın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • Study with Substance P

    Study with S

    31 Mayıs 2008
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009