Bir tablonun bir çok alt tabloya çocuk olabilecek kayıtları içerdiği bir veritabanımız var. Sahipin kimliği ve bir tablo adı oluşan bir "yumuşak" yabancı anahtarı vardır. Bu (anti) desen "polimorfik çağrışımlar" olarak bilinir. En iyi veritabanı tasarımının olmadığını biliyoruz ve bunu yakın zamanda değiştireceğiz, ancak yakın gelecekte değil. Bana bir basit örneği gösterelim:Modelleme polimorfik çağrışımlar veritabanı-ilk karşı kod ilk
İkisiEvent
, Person
ve Product
Yorumda kayıtları var. Gördüğünüz gibi, zor FK kısıtlaması yoktur.
İdare Framework yılında Event
bir EventComments
koleksiyonunu, vb .:
alt sınıfları ve dernekler sonra elle eklenir var vs. EventComment
içine Comment
sublassing olarak bu modeli destekleyen ve izin mümkündür Temel modelin veritabanından oluşturulması. OwnerCode
, bu TPH modelindeki ayrımcıdır. Lütfen Event
, Person
ve Product
'un tamamen farklı öğeler olduğunu unutmayın. Onlar için ortak bir temel sınıfa sahip olmak mantıklı değildir.
Bu, önce bir veritabanıdır. Gerçek yaşam modelimiz böyle çalışıyor, sorun değil.
Tamam. Şimdi kod ilk önce hareket etmek istiyoruz. Bu yüzden, veritabanını bir kod ilk modeline (EF Power Tools) tersine mühendislik yaparak başlattım ve alt sınıfları oluşturmaya ve dernekleri ve mirasları haritalamaya devam ettim. Linqpad'deki modele bağlanmaya çalıştı. O zaman sorun başladı. Bu model ile bir sorguyu yürütmek çalışırken
bir InvalidOperationExeception
yabancı anahtar bileşeni atar 'OwnerId' türü 'EventComment' üzerinde bildirilen özelliği değildir. Modelden açık bir şekilde hariç tutulmadığını ve geçerli bir ilkel özellik olduğunu doğrulayın. Ben iki yönlü bir ilişkinin var olduğu ve
OwnerId
Comment
bir özellik olarak eşleştirilmiş zaman
bu gerçekleşir. Benim EventMap
sınıfı (EntityTypeConfiguration<Event>
) eşleştirme şuna benzer: Bu MetaDataException
atar
this.HasMany(x => x.Comments).WithRequired().Map(m => m.MapKey("OwnerId"));
:
yüzden modeldethis.HasMany(x => x.Comments).WithRequired(c => c.Event) .HasForeignKey(c => c.OwnerId);
OwnerId
olmadan dernek eşleştirmek için çalıştı Belirtilen şema geçerli değil. Hatalar: (10,6): hata 0019: Türdeki her özellik adı benzersiz olmalıdır. Mülk adı 'OwnerId' zaten tanımlandı. (11,6): hata 0019: Bir türdeki her özellik adı benzersiz olmalıdır. Mülk adı 'OwnerId' zaten tanımlandı.
Üç varlık yorum çağrışımından ikisini kaldırırsam, sorun yok, ama tabi ki bu bir tedavi değil.
Bazı başka ayrıntıları:
- Bir DBContext jeneratör öğesi ekleyerek EDMX dan ("ikinci kod") bir çalışma DBContext modeli oluşturmak mümkündür. (Bu şimdilik bir çalışma olacaktır). I EDMX (bir ilişki ile) çalışma kod ilk modeli dışa
- (
EdmxWriter
) ilişki bu kavramsal modelin bir parçası olan orijinal EDMX oysa depolama modelinde olduğu görülmektedir. Yani
, nasıl bu model kod Önce oluşturmak olabilir? Anahtarın, ilk önce dernekleri, kavramsal modelde değil, depolama modeliyle eşleştirmesi için ilk önce nasıl talimat verileceğini düşünüyorum. karmaşıklık bu seviyede herhangi bir şema üzerinde EF kullanırken
Hiç modeli Kod-Birinci ile çalışmak size? Db-First/EDMX için çalıştığı ilginç. Ben benzer bir model hakkında bir soru vardı ve CodePlex gelen son kelime temelde "desteklenmiyor" ve "temel EF sınırlama" idi (http://stackoverflow.com/a/14880084/270591). Ancak, modeliniz EDMX ile çalışıyorsa, aslında bir ilk ilk sınırlama değil, genel bir ilk sınırlama gibi görünmektedir. – Slauma
Evet, veritabanı ilk modeli çalışıyor (tanrıya şükür). Gerçek model bile daha karmaşıktır çünkü kompozit kalıtımsal ayrımcılara sahiptir. Sorun değil. Kod ilk sorun. Hiç db-first modelini denedin mi? –
Hayır, hiç denemedim. Code-First'in tüm edmx özelliklerini desteklemediğini biliyoruz, ancak bu durumda gerçekten bir değişiklik beklemiyordum. Btw'nin CodePlex'deki eski sayıdaki onayını istedim (https://entityframework.codeplex.com/workitem/865, sayfadaki son yorum). Kapalı bir öğede bir cevap bekleyebilir miyim emin değilim. – Slauma