2013-06-22 4 views
13

"Das wichtigste Ende dieser Zuordnung muss explizit mit der Beziehung fließend API oder Datenanmerkungen konfiguriert werden."Das prinzipielle Ende dieser Zuordnung muss explizit konfiguriert werden, entweder über die fließende Beziehung API oder Datenannotationen

Ich bekomme diesen Fehler in Entity Framework 4.4 beim Aktualisieren/Migrieren der Datenbank, aber ich versuche nicht, eine 1: 1-Beziehung anzugeben. Ich möchte etwas wie folgt aus:

public class EntityA 
{ 
    public int ID { get; set; } 
    public int EntityBID { get; set; } 

    [ForeignKey("EntityBID")] 
    public virtual EntityB EntityB { get; set; } 
} 

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 
} 

wo Entität muss eine Entität Elternteil haben, während die Entität eine bevorzugte Entität Kind haben kann, aber muss nicht. Das bevorzugte Kind sollte eines der Kinder sein, die dem Elternteil zugeordnet sind, aber ich weiß nicht, wie ich dies in der Datenbank durchsetzen kann. Ich plane, es programmatisch zu erzwingen.

Wie komme ich um diesen Fehler oder was ist eine bessere Möglichkeit, diese Beziehungen zu erreichen?

+1

'[ForeignKey („EntityAID“) ] bedeutet, dass es eine EntityB.EntityAID-Eigenschaft geben sollte. Hast du es in einer Probe verpasst? – Dennis

+1

Meinst du [ForeignKey ("PreferredEntityAID")]? – ChaseMedallion

+0

Danke für den Fang. Habe es in meinem Beispiel einfach verpasst. Ich habe es bearbeitet. – lintmouse

Antwort

28

Entity Framework-Code - Erste Konventionen gehen davon aus, dass EntityA.EntityB und EntityB.PreferredEntityA zu derselben Beziehung gehören und die inverse Navigationseigenschaften voneinander sind. Da beide Navigationseigenschaften Referenzen sind (keine Sammlungen), leitet EF eine Eins-zu-Eins-Beziehung ein.

Da Sie eigentlich zwei Eins-zu-viele-Beziehungen wünschen, müssen Sie die Konventionen außer Kraft setzen. Mit Ihrem Modell ist es nur möglich mit Fluent API:

modelBuilder.Entity<EntityA>() 
    .HasRequired(a => a.EntityB) 
    .WithMany() 
    .HasForeignKey(a => a.EntityBID); 

modelBuilder.Entity<EntityB>() 
    .HasOptional(b => b.PreferredEntityA) 
    .WithMany() 
    .HasForeignKey(b => b.PreferredEntityAID); 

(. Wenn Sie diese verwenden, können Sie die [ForeignKey] Attribute entfernen)

Sie nicht eine Zuordnung angeben, die, dass die bevorzugte Kind gewährleisten würde, ist immer eine die zugehörigen Kinder.

Wenn Sie nicht wollen, Fluent API, sondern nur Daten Anmerkungen verwenden Sie eine Sammlung Immobilien in EntityB hinzufügen und in Beziehung zu EntityA.EntityB mit dem [InverseProperty] Attribute:

public class EntityB 
{ 
    public int ID { get; set; } 
    public Nullable<int> PreferredEntityAID { get; set; } 

    [ForeignKey("PreferredEntityAID")] 
    public virtual EntityA PreferredEntityA { get; set; } 

    [InverseProperty("EntityB")] // <- Navigation property name in EntityA 
    public virtual ICollection<EntityA> EntityAs { get; set; } 
} 
+2

Das tat den Trick. Vielen Dank. – lintmouse