Entity Framework 4, POCO nesneleri ve ASP.Net MVC2. BlogPost ve Tag varlıkları arasında çoktan çoğa bir ilişkim var. Bu, T4 tarafından oluşturulan POCO BlogPost sınıfımda:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Bir BlogPost ve ilgili Etiketleri ObjectContext'in bir örneğinden istiyorum ve başka bir katmana gönderiyorum (MVC uygulamasında görüntüle). Daha sonra, değişen özellikler ve değişen ilişkilerle güncellenmiş BlogPost'u geri alıyorum. Örneğin "A" "B" ve "C" etiketleri vardı ve yeni etiketler "C" ve "D" dir. Benim özel örneğimde yeni Etiketler yoktur ve Etiketlerin özellikleri asla değişmez, bu nedenle kaydedilmesi gereken tek şey değişen ilişkilerdir. Şimdi bunu başka bir ObjectContext'e kaydetmem gerekiyor. (Güncelleme: Şimdi aynı bağlamda yapmaya çalıştım ve başarısız oldum.)
Sorun: İlişkileri düzgün bir şekilde kurtarmasını sağlayamıyorum. Bulduğum her şeyi denedim:
- Controller.UpdateModel ve Controller. TryUpdateModel çalışmıyor.
- Eski BlogPost'u bağlamdan almak ve ardından koleksiyonu değiştirmek işe yaramıyor. (sonraki noktadan itibaren farklı yöntemlerle)
- Bu muhtemelen işe yarardı, ancak umarım bu çözüm değil, geçici bir çözümdür :(.
- Her olası kombinasyonda BlogPost ve / veya Etiketler için Attach / Add / ChangeObjectState işlevleri denendi. Başarısız oldu.
- Bu bakışlar ihtiyacım olanı gibi değil, ama (ben bunu düzeltmek için çalıştı, ancak benim sorun için olamaz) işi yapmaz.
- Bağlamın ilişki nesneleri ChangeState / Add / Attach / ... denendi. Başarısız oldu.
"Çalışmıyor", çoğu durumda, hata oluşturmayana ve en azından BlogPost'un özelliklerini kaydedene kadar verilen "çözüm" üzerinde çalıştığım anlamına gelir. İlişkilerde ne olduğu değişir: genellikle Etiketler yeni PK'larla Etiket tablosuna yeniden eklenir ve kaydedilen BlogPost orijinal olanlara değil bunlara başvurur. Elbette döndürülen Etiketlerin PK'leri var ve kaydetme / güncelleme yöntemlerinden önce PK'leri kontrol ediyorum ve bunlar veritabanındakilere eşitler, bu nedenle muhtemelen EF bunların yeni nesneler olduğunu ve bu PK'lerin geçici olanlar olduğunu düşünüyor.
Bildiğim bir sorun ve otomatikleştirilmiş basit bir çözüm bulmayı imkansız hale getirebilir: Bir POCO nesnesinin koleksiyonu değiştirildiğinde, bu yukarıda belirtilen sanal koleksiyon özelliği tarafından gerçekleşmelidir, çünkü o zaman FixupCollection hilesi diğer uçtaki ters referansları güncelleyecektir. çoka çok ilişkisi. Ancak, Görünüm güncellenmiş bir BlogPost nesnesini "döndürdüğünde" bu gerçekleşmedi. Bu, belki sorunumun basit bir çözümü olmadığı anlamına gelir, ancak bu beni çok üzer ve EF4-POCO-MVC zaferinden nefret ederim :(. Ayrıca bu, EF'in bunu MVC ortamında hangisi olursa olsun yapamayacağı anlamına gelir. EF4 nesne türleri kullanılır :(. Anlık görüntü tabanlı değişiklik izlemenin, değiştirilen BlogPost'un mevcut PK'larla Etiketlerle ilişkisi olduğunu bulması gerektiğini düşünüyorum.
Btw: Aynı sorunun bire çok ilişkilerde de olduğunu düşünüyorum (google ve meslektaşım öyle söylüyor). Bunu evde deneyeceğim, ancak bu işe yarasa bile uygulamamdaki altı çoka çok ilişkimde bana yardımcı olmuyor :(.