SORU
3 EYLÜL 2010, Cuma


EF4 POCO değişiklikleri kaydederken güncelleme ilişkiler nesneler

Varlık Çerçevesi 4, POCO nesneleri ve ASP.Net MVC2. Pek çok ilişki var, Vitamin ve Etiket varlıklar arasında diyelim. Bu T4 oluşturulan POCO seni mutlu edebilmek benim sınıfımda var anlamına gelir:

public virtual ICollection<Tag> Tags {
    // getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;

ObjectContext örneği bir Vitamin ve ilgili Kategori için soruyorum ve başka bir katmana (MVC uygulamasında View) gönderin. Daha sonra tekrar değiştirilen özellikleri ve değişen ilişkileri ile güncellenen Vitamin alıyorum. Örneğin etiketleri vardı "" "B" ve "C", ve yeni etiketler "C" ve "D". Özellikle benim örnekte yeni bir Kategori yok ve Etiketlerinin özellikleri asla değişmez, kurtarılması gereken tek şey değişen ilişkilerdir. Şimdi başka bir ObjectContext bu kurtarmalıyım. (Güncelleme: Şimdi aynı içerik örneği olarak çalıştım ve aynı zamanda başarısız oldu.)

Sorun: bu ilişkileri düzgün kurtarabilirim. Bulduğum her şeyi denedim:

  • Denetleyicisi.UpdateModel ve Denetleyicisi.TryUpdateModel çalışmıyor.
  • Eski bağlamı sonra toplama değiştirmesini Vitamin almaya çalışmıyor. (bir sonraki noktadan farklı yöntem ile)
  • This muhtemelen işe yarardı, ama bu sadece geçici bir çözüm, çözüm değildir umarım :(.
  • Takın her olası kombinasyonları Vitamin ve/veya Etiketler için/ChangeObjectState fonksiyonlar Eklemek/çalıştı. Başarısız oldu.
  • This ihtiyacım var, ama çalışmıyor ne gibi (düzeltmeye çalıştım, ama benim için sorun yok) görünüyor.
  • Denedim ChangeState///... ilişki, bağlam nesneleri Ekle. Başarısız oldu.

"İşe yaramıyor" üzerinde çalıştığım çoğu durumda anlamı," herhangi bir hata üretir ve seni mutlu edebilmek için en az özellikleri kadar kaydeder. "çözüm bulunsa İlişkiler değişir ne olacak: genellikle Etiketleri daha yeni Mm ve kaydedilen önemli Vitamin başvuruları ve orijinal olanlar değil Etiketi ile tabloya eklenir. Tabii ki iade Etiketleri Mm, ve daha önce kaydetme/güncelleme yöntemleri I onay Mm ve onlar eşit olanları veritabanı çok büyük ihtimalle EF düşünen yeni nesneler ve o Mm olan geçici olanlar.

Bir sorun olduğunu biliyorum Ve belki yapmak imkansız bulmak için bir otomatik çözüm basit: ne Zaman bir POCO nesnesi koleksiyonu değişti, bu kaza ile yukarıda bahsedilen sanal toplama özelliği, çünkü o zaman FixupCollection kandıracak update ters başvurular diğer ucunda çok-çok ilişki. Ancak bir Görünüm "güncelleştirilmiş bir Vitamin nesne, böyle bir şey olmadı." döndüğünde Bu belki de benim soruna basit bir çözüm yok, ama bu beni çok üzerdi ve EF4-POCO-MVC zaferi nefret ediyorum anlamına gelir :(. Ayrıca o EF kullanılır hangisi MVC ortamında bunu yapamam yani :(. Anlık göre değişiklik izleme değişmiş Vitamin varolan Mm ile Etiketleri ilişkilerine sahip olduğunu öğrenmek gerektiğini düşünüyorum.

Btw: aynı sorun bir-çok ilişkileri (google ve meslektaşım söyle). olur bence Evde bir deneyin vereceğim, ama eğer bu işe yararsa bile benim app çok çok altı ilişkilerimde bana yardımcı olmuyor :(.

CEVAP
3 EYLÜL 2010, Cuma


Hadi bu yolu deneyin:

  • İçerik Vitamin ekleyin. Bağlam nesnesi ekledikten sonra nesnenin durumunu, ilgili tüm nesneleri ve tüm ilişkileri Değişmeden ayarlanır.
  • Bağlam kullanın.ObjectStateManager.ChangeObjectState Modifiye için Vitamin ayarlamak için
  • Etiket topluluk içinde yineleme
  • Bağlam kullanın.ObjectStateManager.ChangeRelationshipState mevcut Etiket ve Vitamin ilişkisi için durumunu ayarlamak için.
  • SaveChanges

Düzenleme:

Benim yorum senin EF senin için birleştirme yapacak sahte umut verdi sanırım. Bu sorun ile çok oynadım ve sonucum EF senin için bunu söylüyor. Ayrıca MSDN sorumu buldunuz sanırım. Gerçekte internette bu tür sorular var. Sorun bu senaryo ile başa çıkmak için nasıl net bir şekilde ifade etmiş olmasıdır. Yani sorun bir göz atalım:

Sorun arka plan

EF sebat güncellenecek olan bilir varlıklar üzerinde değişiklikleri izlemek için, eklenen veya silinen ihtiyacı var. Sorun değişiklikleri izlemek için ObjectContext sorumluluğundadır. ObjectContext bağlı varlıklar için değişiklikleri izlemek mümkün. ObjectContext dışında yaratılan varlıklar hiç izlenmez.

Sorun açıklaması

Yukarıdaki açıklama dayanarak açıkça EF varlık her zaman içeriğe bağlı bulunduğu bağlı senaryolar için daha uygundur - WinForm uygulama için tipik söyleyebiliriz. Web uygulamaları kapsamında talep işleme ve taraf içeriği istemciye HTTP yanıt olarak geçirilir sonra kapalı olduğu kopuk senaryo gerektirir. Sonraki HTTP isteği yeniden olması gereken bir varlık, yeni içerik eklenmiş değiştirilmiş içerik sağlar ve kalıcı. Rekreasyon genellikle bağlam kapsamında (sebat ignorace ile katmanlı mimari) dışında olacak.

Çözüm

Nasıl bu kadar kopuk bir senaryo ile başa çıkmak için? POCO sınıfları kullanırken değişiklik izleme ile başa çıkmak için 3 yol var:

  • Anlık - aynı bağlam gerektirir = kopuk senaryo için işe yaramaz
  • Dinamik izleme vekiller aynı bağlam = kopuk senaryo için işe yaramaz gerektirir
  • El ile eşitleme.

Tek varlık manuel senkronizasyon kolay bir iş değildir. Sadece varlık ve eklemek, silmek veya ayarlamak için devlet DeleteObject güncelleme için Modifiye için ObjectStateManager ekleme için AddObject aramak gerekir. Gerçek acının tek bir varlık yerine nesne grafiği ile anlaşma yapmak zorunda gelir. Bu ağrı bağımsız dernekleri (Yabancı Anahtar özelliği olmayanlar) ile uğraşmak zorunda kaldığınızda bile çok kötü ve çok ilişkiler çok. Bu durumda el ile nesne grafiği her varlık aynı zamanda nesne grafiği her ilişki eşitlemeye var.

Attaching and Detaching objects diyor ki: el ile eşitleme MSDN belgelerine göre çözüm olarak önerdi

Nesneleri nesne bağlı Değişmeyen bir durumda bağlam. Eğer bir nesnenin durumunu değiştirmek gerekir ya senin yüzünden ilişkiyi biliyor nesne değiştirilmiş olduğunu müstakil bir devlet kullanın aşağıdaki yöntemleri.

Bahsedilen yöntem ve ObjectStateManager bu ChangeObjectState ChangeRelationshipState = el ile değişiklik izleme. Diğer MSDN belgelerine makalesinde benzer bir öneri: diyor ki: Defining and Managing Relationships

Eğer bağlantısı ile çalışıyorsanız el ile yönetmek gerekir nesneleri eşitleme.

Ayrıca tam olarak EF bu davranışı eleştirmek olan blog post EF v1 ile ilgilidir.

Çözüm için bir sebep

EF çok "" ve ayarlarıRefresh, Load, ApplyCurrentValues, , * ApplyOriginalValues*12 vb. işlemleri yardımcı vardır Ama araştırmama göre tüm bu özellikler sadece tek bir varlık için çalışıyor ve sadece skaler preperties (= navigasyon özellikleri ve ilişkileri etkiler. Ben oldukça karmaşık türleri varlık iç içe olan bu yöntemler test değil.

Başka bir çözüm önerdi

Gerçek yerine, sorunu çözmez bir şey Self Tracking Entities (STE) olarak adlandırılan sağlar EF işlevselliği Birleştirme. Tüm STE önce aynı örneği tüm işlem için kullanılan yalnızca çalışır. Web uygulama görünüm durumu veya oturumda örneği sakladığınız sürece durum böyle değil. Bundan dolayı EF kullanarak çok mutsuzum ve Arabiriminin özellikleri kontrol edeceğim. İlk gözlem Arabiriminin belki de functionality böyle söylüyor.

Sonuç

MSDN forum related question bir tek bağlantı ile bu varsayımlar sona erecek. Zeeshan Yardımcı Kadın Oyuncu (cevabı kontrol edin. Entity Framework 4.0 Recipes kitabın yazarıdır. Eğer bir nesne otomatik birleştirme grafikler desteklenmiyor diyorsa, ona inanırım.

Ama yine de tamamen yanılıyorumdur öyle bir ihtimal var ve bazı otomatik birleştirme işlevselliği EF var.

Edit 2:

Gördüğünüz gibi bu zaten 2007'de öneri olarak MS Connect eklendi. MS bir sonraki sürümünde yapılması gereken bir şey olarak kapattı ama aslında hiç bir şey bu boşluğu dışında STE artırmak için yapılmıştı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • Techmoan

    Techmoan

    31 Mayıs 2009
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005