2010-08-18 29 views
11

Tekil ve Tek iş parçacığı olan ve düşük hacimli istemcilerden oluşan bir grup hizmet sunan bu hizmete sahibim. SQL Server'da Entity Framework ve Verileri kullanır.Varlık Çerçevesi (3.5) - Değişiklikleri Reddet

İstemciden Veri Kaydetme isteğinin herhangi biri başarısız olursa, özgün başarısız veri nesnesini kaydetmeye çalışırken, sonraki tüm istekler başarısız olur.

Kaydetme başarısız olduğunda EF verisindeki değişiklikleri geri almanın bir yolu var mı? Peşin

Teşekkür

cevap

4

Sorunun Cevabı "Bağlamdaki Değişiklikleri Atıramıyorsunuz" yerine, Marc'ın açıkladığı gibi ObjectContext'i iptal etmesi gerekiyor.

11

Varlık-modelleri/veri-bağlamlarda/vb iyi işin birimler olarak ele vardır. İptal etmeniz gerekiyorsa, bağlamı atın ve yeni bir tane ile başlayın. Ve eğer başarılı olursanız, yine de atın!

  • veri büyümesini (bunu, ona tek iş parçacıklı yaparak bu kaçınılmalıdır sesler rağmen) orada (

    • parçacığı: Her talep gerçekten aksi takdirde bir dizi sorunu alabilirsiniz, ayrı veri bağlamları kullanarak olmalı Eğer dokunmak her satır etrafında kalır;; bir kimlik yöneticisi açık bir bağlantı hogging aslında birden çok kez)
    • genel izolasyon vb
    • bağlantı süresi yönetimi()
    • vb
  • +0

    Evet, bunun çok geç olduğunu anladım .. ama sorun şu ki, nesne bağlamını elden çıkarır ve veritabanını bağlamaya çalışırsanız, performans çok kötüdür. Bu yüzden Nesne bağlamını canlı tutmaya karar verdik. Bir arıza durumunda değişiklikleri geri alabileceğimiz bir yol bulmaya çalışıyorum. – Bhuvan

    +0

    @Bhuvan - bu "performans kötüdür" iddiası genellikle aşırı sorgulama verileri anlamına gelir. Veri bağlamının çok sıkı bir şekilde kapsandığı çok fazla iş ** yaptım ve mükemmel bir performans. –

    3

    , böylece ben RejectChanges gerek bakın

    context.Refresh(RefreshMode.StoreWins, entity) 
    

    arayarak varlık yenileyebilirsiniz.

    +0

    Teşekkürler Sven .. Ama sorun şu ki, hangi varlıkların değiştirildiğini takip etmek zorunda. Kaydetme başarısız olursa, taahhüt edilmesi veya reddedilmesi gereken bir varlık zincirine sahibim. MS'nin bunu ele almak için daha iyi bir yol sunması gerektiğini düşünüyorum. – Bhuvan

    8

    Not: kolay bir çekicilik olarak EF 4.1 veya bu işi yapan 4.2 yükseltebilirsiniz:

    context.Entry(myEntity).State = EntityState.Unchanged; 
    

    ayrıntı için this bakınız.

    Public ReadOnly Property DirtyObjects() As IEnumerable(Of ObjectStateEntry) 
        Get 
        Return ObjectStateManager.GetObjectStateEntries(
         EntityState.Added Or 
         EntityState.Deleted Or 
         EntityState.Modified) 
        End Get 
    End Property 
    
    
    Public Overloads Sub Refresh() 
        For Each entry In DirtyObjects 
        Select Case entry.State 
    
         Case EntityState.Modified 
         Dim original = entry.OriginalValues 
         For Each prop In entry.GetModifiedProperties() 
          Dim ordinal = original.GetOrdinal(prop) 
          entry.CurrentValues.SetValue(ordinal, original(ordinal)) 
          RaisePropertyChanged(entry.Entity, prop) 
         Next 
         entry.AcceptChanges() 
         Case EntityState.Deleted 
         'I think I would need to call the above again, cuz it might be 
         'changed values on a Deleted-state entry too. 
         entry.ChangeState(EntityState.Unchanged) 
         Case EntityState.Added 
         entry.ChangeState(EntityState.Detached) 
         Case Else 
         'do nothing 
         Debug.Fail("It's not supposed to stop here.") 
        End Select 
        Next 
    End Sub 
    

    Başkanlarını up: - (kolayca C# için transkripsiyonu edilmelidir, üzgünüm VB)

    sizin ObjectContext oluşturulan sınıfına kısmi sınıf oluşturun ve içinde aşağıdaki yöntemleri içerir! Yaklaşan yeni versiyonda bu özellik çok daha kolay oldu.

    +1

    . Teşekkürler .. Harika Çözüm ... – Bhuvan