Einfach, in C# EF6, wie ordnen Sie zwei Navigationseigenschaften derselben Tabelle zu, während ihre Ergebnissätze getrennt bleiben? Im einfachen Englisch habe ich eine Klasse, die ich zwei Sammlungen in einer anderen Klasse haben möchte. Mit anderen Worten, ich möchte zwei Sammlungen desselben Typs, aber mit verschiedenen Elementen. Unglücklicherweise scheint EF6 beide Sammlungen gleich zu behandeln und gibt ihnen beide die gleichen Elemente (jeden Datensatz in der Tabelle).C# EF6: Zwei Navigationseigenschaften des gleichen Typs
Das Beste, was ich von Dutzenden von StackOverflow Antworten gefunden habe, war dies, aber es hat das beschriebene Problem. In diesem Beispiel hat ein Vater viele Sons und viele Töchter, und sie haben jeweils derjenige Vater. Idealerweise können sowohl Söhne als auch Töchter in derselben Tabelle gespeichert werden Kind.
class Father
{
[Key]
public long Id { get; set; }
public virtual ICollection<Child> Sons { get; set; }
public virtual ICollection<Child> Daughters { get; set; }
}
class Child
{
[Key]
public long Id { get; set; }
public long FatherId_1 { get; set; }
public Father Father_1 { get; set; }
public long FatherId_2 { get; set; } // One for each collection???
public Father Father_2 { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Child>()
.HasRequired(e => e.Father_1)
.WithMany(e => e.Sons)
.HasForeignKey(e => e.FatherId_1);
modelBuilder.Entity<Child>()
.HasRequired(e => e.Father_2)
.WithMany(e => e.Daughters)
.HasForeignKey(e => e.FatherId_2);
}
Das Problem dabei ist, wenn die Daten wieder aus der Kindern Tabelle zu lesen, es unterscheidet nicht zwischen Sons und Töchtern. Das heißt, die Sons Sammlung wird nicht nur enthalten Sons sondern auch Töchter, und so wird die Töchter Sammlung. Ich hätte erwartet, dass EF6 versucht, eine Diskriminator-Spalte zu verwenden, aber das tut es nicht.
Frage: Wie ordnen Sie zwei Navigationseigenschaften derselben Tabelle zu und können die Datensätze weiterhin in die entsprechenden Navigationseigenschaften einlesen? Oder ist das Beispiel korrekt und mein Problem ist anderswo? Oder ist das nicht möglich, und sie müssen ihren eigenen Tabellen zugeordnet werden (mit identischen Schemas).
Es ist ein Modell "Child", das in zwei Sammlungen aufgeteilt werden muss, nicht zwei Modelle, die in einer Tabelle gespeichert werden müssen. Warum würden Sie zwei Klassen für denselben logischen Typ in Ihrem Modell erstellen? Können Sie zeigen, wie Sie das obige Problem im Code lösen würden? – drifter
Wenn ich das richtig lese, ordnet es einige Eigenschaften einer Tabelle und andere Eigenschaften einer anderen Tabelle zu. Ist das richtig? Ich habe mein Problem im ersten Absatz geklärt. Grundsätzlich habe ich eine Klasse, die ich zwei Sammlungen in einer anderen Klasse haben möchte. Dies scheint ein allgemeines Muster zu sein. Ich bin verwirrt, warum es wenig Information darüber gibt. – drifter