7

Ben EntityFramework 5 kullanıyorum ben zaten doğru DbSets belirledik ve nesneleri birbirine uygun referanslar içerebilir. Bu benim için yeni değil ve işler iyi çalışıyor. EntityFramework anonim kompozit anahtar özellik adı çakışması

Şimdi bu durumda ben, bazen, (bu durumda veya nesneyi) yabancı bir tablonun anahtarı içeren bazı kompozit tuşları var. Bunun için DbContext'in OnModelCreating yöntemindeki HasKey<>() işlevini kullanıyorum. Bu özellikler farklı adlara sahip olduğunda sorun yoktur, ancak bu özellikler aynı ada sahip olduğunda, taşıma yapılamaz.

Bir örnek: Verilen kodda görebileceğiniz gibi

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

, nesne PatientVisit Kod adlı bir özelliği vardır, ancak bu özellik sürece farklı bir hasta ile tekrarlanır olarak tekrarlanabilir. Varlık Hastasında ayrıca bir Kod adlı tanımlanmış bir anahtar bulunur.

Anonim türü aynı adı (bariz) çıkarım iki özelliklere sahip olamaz. Tipik çözüm böyle anonim türünün özelliklerini isim olacaktır:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { PatientCode = x.Patient.Code, VisitCode = x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

Ama bunu yaparken, bu hata mesajı fırladığı bir göç eklemeyi deneyin.

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

cevap

0

Sana PatientVisit yeni bir özellik PatientCode vermek Burada yapılacak olan gerekenleri düşünüyorum. Hangisi Patient'a yabancı anahtar olur. Örneğin

Sonra
HasRequired<PatientVisit>(v => v.Patient).WithMany() 
              .HasForeignKey(v => v.PatientCode) 

Eğer

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

bana başvurulan nesnelerin elle Keys ve kimlikleri eklemek gerektiren çözümler olduğunu biliyorum yapabiliriz, ama bu bir veritabanına basit nesne modeli "değişen" ima -mapping modeli ve bunu yapmamayı tercih ederim. –

+0

Çözümünüz, uyguladığım yönteme benzer, yalnızca Veri Eşlemeleri tarafından yapıldığı için akıcı bir eşleme gerekmez. Temel olarak, bir sanal gezinme özelliğinin yabancı anahtarına bildirilen bir özelliği eklemek için 'ForeignKey 'özniteliğini kullanıyor ... ancak yine de, _ __ anchor veya anatman özelliklerinin gezinme özelliklerini açıkça tanımlaması gerektiğini ima eder. Veritabanı ile ilgili anahtar özellikler olmadan temiz, temiz bir nesne modeline sahip olmak isterim. –

+0

Sözünü ettiğim _current-ama-want-want_ çözümünün bir örneği için, bkz. [Bu konu] (http://stackoverflow.com/questions/5388077/primary-foreign-key-in-entity-framework) Çok iyi açıklandığı yer. –