17

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

İkisi Event

enter image description here

, 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 .:

enter image description here

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 OwnerIdComment 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")); 

:

this.HasMany(x => x.Comments).WithRequired(c => c.Event) 
    .HasForeignKey(c => c.OwnerId); 

yüzden modelde 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

+1

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

+0

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? –

+0

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

cevap

1

Ben şahsen ilk Veritabanı ile sopa. İlk olarak kodla ilgili karmaşık şemalarla ilgili sorunlar yaşadım. Belki de daha yeni sürümler biraz daha iyi, ancak karmaşık ilişkileri denemek ve kodlamak için endişelenmek, motorun sizin için üretmesine izin vererek daha az düz görünüyor. Ayrıca bir ilişkiyi bu karmaşık hale getirdiğinde, bunu EF ile üretmeye çalışmaktan kaçınacağım ve ortaya çıkabilecek performans darboğazlarının daha kolay bir şekilde giderilmesi için saklı yordamları kullanmayı deneyeceğim.

+0

Sonunda ben de bu yolu gitmek zorunda sonuca geldik. Buradaki nokta, edmx modelinin kavramsal modelde değişiklik yapılmasına izin vermesidir, kod ilk olarak bu ayrımı yapmak için herhangi bir takım önermez. Kod ilk önce tüm haritalama yapılandırmaları aynı şekilde mağaza modeline ve kavramsal modele girer. Korkarım ki EF ekibi, kod ilk API'sındaki kavramsal modeli (mağaza modelinden ayrı olarak) şekillendirmek için araçlar geliştirmekle ilgilenmiyor. Gelecekte –

+0

İyi şanslar, MS edmx destek fişi çekti ... http://www.theregister.co.uk/2014/10/23/entity_framework_goes_codefirst_only_as_microsoft_shutters_yet_another_visual_modelling_tool/ –