2017-06-07 5 views
0

Ich habe ein Problem mit Entity Framework 6 Code zuerst erstellen mehrere Fremdschlüssel aus meinen Klassen, wenn es nur eine erstellen sollte. Betrachten Ich habe 2 Klassen -C# Entity Framework - Mehrere Fremdschlüssel

public class Work 
{ 
    public Work() 
    { 
     Document1 = new Collection<Document>(); 
     Document2 = new Collection<Document>(); 
     Document3 = new Collection<Document>(); 
    } 
    [Key] 
    public int WorkId { get; set; } 
    public virtual ICollection<Document> Document1 { get; set; } 
    public virtual ICollection<Document> Document2 { get; set; } 
    public virtual ICollection<Document> Document3 { get; set; } 
} 

public class Document 
{ 
    public int? WorkId { get; set; } 
    [ForeignKey("WorkId")] 
    public Work Work { get; set; } 
} 

Nun, wenn ich den Code zuerst update-Datenbank Befehl ausführen, in meine Dokumente Tabelle es 3 verschiedene Fremdschlüssel für den Arbeitstisch schafft WorkId, Work_Id1 , Work_Id2, dies sollte nur ein Fremdschlüssel anstelle von 3 sein. Ich weiß, es sollte eine einfache Annotation sein, um dies zu beheben oder eine fließende Zuordnung, die ich hinzufügen muss?

+0

'Arbeit' ist verbunden mit' Dokument' durch drei Eigenschaften (Sammlung) Dokument1, Dokument2 und Dokument3. Deshalb erstellt er drei Fremdschlüssel. Wenn Sie nur einen Fremdschlüssel angeben möchten, werden die anderen beiden mit der Dokumenteneinheit verbunden. –

Antwort

0

Offenbar ein Work kann null oder mehr Document1, null oder mehr Document2 und null oder mehr Document3. Alle diese Dokumente sind vom Typ Dokument.

Jedes Dokument gehört zu genau einem Work, in denen es entweder ein Document1, ein Document2 oder ein Document3. Das Problem ist, dass Sie bei Verwendung Ihrer Klassen nicht wissen, um welchen Dokumententyp es sich handelt.

Die Datenbank freundliche und flexible Lösung ist jedem Dokument eine Eigenschaft zu geben, erklärt, welche Art von Dokument es ist, und legen Sie alle Dokumente in eine Tabelle:

public enum DocumentType 
{ 
    Document1, 
    Document2, 
    Document3, 
}; 

public class Work 
{ 
    public int WorkId { get; set; } 
    public virtual ICollection<Document> Document { get; set; } 
} 

public class Document 
{ 
    public int DocumentId {get; set;} // primary key 
    public DocumentType DocumentType {get; set;} 

    public int WorkId { get; set; } 
    public Work Work { get; set; } 
} 
public MyDbContext : DbContext 
{ 
    public DbSet<Work> Works {get; set;} 
    public DbSet<Document> Documents {get; set;} 
} 

Das Ergebnis ist eine Tabelle mit Dokumenten. Die Spalte WorkId teilt Ihnen mit, zu welcher Arbeit das Dokument gehört. Column DocumentType wird Ihnen sagen, ob es ein Document1, ein Document2 oder ein Document3 ist.

Auf diese Weise wird es einfach, neue DocumentTypes hinzuzufügen, ohne die Datenbank ändern zu müssen. Wenn Sie schnelle Suchen für alle Dokumente eines bestimmten Typs wünschen, sollten Sie einen zusätzlichen Index mit Schlüsseln erstellen (Id, DocumentType)

Wenn Sie wirklich drei verschiedene Tabellen möchten, zum Beispiel, weil es sein könnte, dass ein Document1 in Zukunft nicht ähnlich ist mehr zu einem Document2, werden Sie erstellen müssen drei Klassen abgeleitet aus dem Dokument und drei DbSet für diese Klassen

public class Document1 : Document 
{ 
    public int WorkId {get; set;} 
    public virtual Work Work {get; set;} 
} 
public MyDbContext : DbContext 
{ 
    public DbSet<Work> Works {get; set;} 
    public DbSet<Document1> Document1s {get; set;} 
    public DbSet<Document2> Document2s {get; set;} 
    public DbSet<Document3> Document3s {get; set;} 
} 

Betrachten Table-per-concrete-class für diese Verwendung. Auf diese Weise erhalten Sie eine Tabelle mit Dokument1, eine Tabelle mit Dokument2 und eine für Dokument3

1

Ihre Work Klasse hat drei Sammlungen von Document, so dass die Klasse Document drei Schlüssel benötigt, um anzugeben, wo sie sich anschliessen. Wenn ich eine Instanz von Document habe, deren WorkId 4 ist, wo ist das auf der Instanz Work mit dieser ID? Gehört es in Document1, Document2 oder Document3? Mit nur einem Schlüssel gibt es keine Möglichkeit, dies festzustellen. Entity Framework weiß das und hat drei Schlüssel zur Lösung des Problems erstellt.

Verwandte Themen