2017-03-02 5 views
2

Ich habe zwei Tabellen mit zusammengesetzten Primärschlüssel:Wie Tabelle mit zusammengesetzten Primärschlüssel zusammengesetzten Fremdschlüssel erstellen

public class Event 
{ 
    [Key] 
    [Column(Order = 1)] 
    public string ID1 { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int ID2 { get; set; } 
    public DateTime EventDate { get; set; } 
    public string DocID1 { get; set; } 
    public int DocID2 { get; set; } 

}

public class EventDocument 
{ 
    [Key] 
    [Column(Order = 1)] 
    public string ID1 { get; set; } 
    [Key] 
    [Column(Order = 2)] 
    public int ID2 { get; set; } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public string Number { get; set; } 

    public virtual ICollection<Event> Events { get; set; } 
} 

Ich brauche einen Verbundfremdschlüssel auf Event erstellen Tabelle zu EventDocument Tabelle

Ich habe versucht, FK wie diese

zu erstellen

Klasse Veranstaltung:

[ForeignKey("DocID1")] 
[Column(Order = 0)] 
public string DocID1 { get; set; } 

[ForeignKey("DocID2")] 
[Column(Order = 1)] 
public string DocID2 { get; set; } 

Aber ich erhalte eine Fehlermeldung:

The property 'DocID1' cannot be configured as a navigation property. The property must be a valid entity type and the property should have a non-abstract getter and setter. For collection properties the type must implement ICollection where T is a valid entity type."}

Ich verstehe nicht mehr, was ich falsch

Antwort

5

Composite-Fremdschlüssel tue erfordert ForeignKey Attribut angewendet werden in der Navigationseigenschaft, die die durch Kommas getrennte Liste der Fremdschlüsseleigenschaftsnamen angibt:

If you add the ForeignKey attribute to a foreign key property, you should specify the name of the associated navigation property. If you add the ForeignKey attribute to a navigation property, you should specify the name of the associated foreign key(s). If a navigation property has multiple foreign keys, use comma to separate the list of foreign key names.

Da Sie in der Event Klasse keine Navigationseigenschaft haben, sollten Sie es auf der entsprechenden Navigationseigenschaft in der EventDocument Klasse gelten:

[ForeignKey("DocID1, DocID2")] 
public virtual ICollection<Event> Events { get; set; } 

und das Problem behoben werden soll.

Aber ich persönlich finde, Beziehungen mit Fluent API zu gründen, um viel einfacher zu verstehen und weniger fehleranfällig zu sein. Zum Beispiel kann das gleiche durch die folgende fließend Konfiguration erreicht werden:

modelBuilder.Entity<EventDocument>() 
    .HasMany(e => e.Events) 
    .WithRequired() // or .WithOptional() 
    .HasForeignKey(e => new { e.DocID1, e.DocID2 }); 

Same btw für den Composite-PKs (statt alle diese Key/Column(Order = ...) Attribute):

modelBuilder.Entity<Event>() 
    .HasKey(e => new { e.ID1, e.ID2 }); 

modelBuilder.Entity<EventDocument>() 
    .HasKey(e => new { e.ID1, e.ID2 }); 
+0

Was für eine klare Antwort !! ! Gehen zu versuchen und zu akzeptieren :) Und was meinst du, indem Sie EventA schreiben: "public virtual ICollection Ereignisse {get; set;}" – Songaila

+0

Zuerst habe ich versucht, 1 var. Ich habe eine Fehlermeldung erhalten: Das ForeignKeyAttribute für die Eigenschaft 'DocID1' vom Typ 'xxx.Event' ist nicht gültig. Die Navigationseigenschaft 'DocID1, DocID2' wurde beim abhängigen Typ 'xxx.Event' nicht gefunden. Der Name-Wert sollte ein gültiger Navigationseigenschaftsname sein. Goint, fließendes API zu versuchen – Songaila

+0

Bleiben Sie mit Fluen API, realyy viel einfacher, ein KEIN MEHR FEHLER zu verstehen. Danke – Songaila

Verwandte Themen