7

Ich verwende EntityFramework 5 (oder 4.3 für .NET Framework 4.0)EntityFramework anonymer Verbundschlüsseleigenschaft Namenskonflikt

In meinem DbContext Objekt habe ich schon die richtigen DbSets gesetzt und die Objekte enthalten richtige Referenzen zueinander. Das ist nicht neu für mich, und die Dinge funktionieren gut.

Jetzt habe ich einige zusammengesetzte Schlüssel, die manchmal den Fremdschlüssel einer Tabelle (oder Objekt in diesem Fall) enthalten. Dazu benutze ich die HasKey<>() Funktion auf der OnModelCreating Methode des DbContext. Wenn diese Eigenschaften unterschiedliche Namen haben, gibt es kein Problem, aber wenn diese Eigenschaften denselben Namen haben, kann die Migration nicht durchgeführt werden.

Ein Beispiel:

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); 
    } 

Wie Sie im Code vorgesehen ist, hat das Objekt PatientVisit eine Eigenschaft namens Code, aber diese Eigenschaft kann so lange wiederholt werden sehen, wie es mit einem anderen Patienten wiederholt. Die Entität Patient hat auch einen Schlüssel, der als Code definiert ist.

Ein anonymer Typ kann nicht zwei Eigenschaften haben, die auf denselben Namen schließen lassen (offensichtlich). Die typische Lösung wäre es, die Eigenschaften des anonymen Typs so zu nennen:

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); 
    } 

Aber dies zu tun, wenn ich versuche, eine Migration dieser Fehlermeldung ausgelöst wird, hinzuzufügen.

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 }'. 

Antwort

0

Ich denke, was Sie hier tun müssen, ist geben PatientVisit eine neue Eigenschaft PatientCode. Welches wäre der Fremdschlüssel zu Patient. ZB

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

Dann können Sie

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

weiß ich, es gibt Lösungen, die mich erfordern manuell die Tasten und Ids der referenzierten Objekte hinzuzufügen, aber das bedeutet ein einfaches Objektmodell in eine Datenbank „Ändern“ -Mapping-Modell, und ich möchte das nicht machen. –

+0

Ihre Lösung ist ähnlich der, die ich implementiert habe, nur dass es kein flüssiges Mapping benötigt, da es von DataAnnotations durchgeführt wird. Grundsätzlich verwendet es das 'ForeignKey'-Attribut, um eine deklarierte Eigenschaft an den Fremdschlüssel einer virtuellen Navigationseigenschaft anzuhängen ... aber es bedeutet dennoch, dass _i explizit die Navigationseigenschaften _und_ die Anker- oder Fremdschlüsseleigenschaften definieren muss. Ich hätte gerne ein ordentliches, sauberes Objektmodell ohne datenbankbezogene Schlüsseleigenschaften. –

+0

Ein Beispiel für die aktuelle Lösung "current-but-not-wanted_" finden Sie unter [this thread] (http://stackoverflow.com/questions/5388077/primary-foreign-key-in-entity-framework) wo es sehr gut erklärt wird. –