Fluent-API, viele-zu-viele in Entity Framework-Core
Ich gesucht habe stackoverflow für eine richtige Lösung auf die Generierung einer viele-zu-viele Beziehung mit EF-Core, Code first und die Fluent-API.
Ein einfaches Szenario wäre:
public class Person
{
public Person() {
Clubs = new HashSet<Club>();
}
public int PersonId { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}
public class Club
{
public Club() {
Persons = new HashSet<Person>();
}
public int ClubId { get; set; }
public virtual ICollection<Person> Persons { get; set; }
}
Bitte korrigieren Sie mich, wenn ich falsch Liege, aber ich könnte ehrlich gesagt nicht finden, eine Frage, die enthält eine ausführliche Erläuterung, wie dies zu tun mit den beschriebenen tools.
Kann mir jemand erklären, wie das geht?
InformationsquelleAutor Anonymous | 2017-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist dies noch nicht möglich EF-Kern ohne eine explizite Klasse, die für die Verknüpfung. Sehen hier ein Beispiel dafür, wie das zu tun.
Es ist ein offenes Problem auf Github Fragen, für die Fähigkeit, dies zu tun, ohne die Notwendigkeit für eine explizite Klasse, aber es ist noch nicht abgeschlossen.
Mit Ihrem Szenario, das Beispiel, das ich verlinkt würde empfehlen, die folgenden entity-Klassen:
Den folgenden
OnModelCreating
wäre dann für die Installation verwendet:Sicher sein, zu gehen, um die offene Frage, die ich verlinkte und Stimme, Ihre frustration, wenn Sie das Bedürfnis verspüren.
EDIT: Die Frage suggeriert die Verwendung einer einfachen
Select
zum navigieren durch diese etwas schwerfällige Hierarchie. Um von einemPersonId
eine Sammlung vonClub
s, die Sie verwenden können,SelectMany
. z.B.:Kann ich nicht bürgen, ob dies wirklich eine "best practice", aber es sollte sicherlich den trick tun und ich denke seine fair zu sagen, es ist nicht übermäßig hässlich.
OnModelCreating
fürPerson
undClub
?InformationsquelleAutor Kirk Larkin
Das richtige "setup" für diese ist:
So, in diesem block für die Konfiguration der "Kleber-Tabelle" nicht notwendig wie in @Kirk Beispiel:
Nicht erforderlich bedeutet nicht falsch. Wird explizit in der Konfiguration tut nicht weh, und tatsächlich, viele Male hilft die Vermeidung von überraschungen, verursacht durch implizite EF-Core-Konventionen. Es gibt Anforderung für die Bereitstellung einen Weg, um loszuwerden, alle Konventionen und explizite Konfiguration für alles.
Was ist mit der fluent-mappings für
Person
undClub
?InformationsquelleAutor paul van bladel
Also jeden
Person
hat null oder mehrClubs
und jederClub
hat null oder mehrPersons
. Wie Sie richtig feststellte, ist dies ein richtigen viele-zu-viele-Beziehung.Wissen Sie wahrscheinlich, dass eine relationale Datenbank benötigt eine extra Tabelle zu implementieren, der diese viele-zu-viele-Beziehung. Die nette Sache über entity framework ist, dass es erkennt diese Beziehung und legt diese extra-Tisch für Sie.
Auf den ersten Blick scheint es ein problem, dass diese zusätzliche Tabelle ist nicht
dbSet
in IhremDbContext
: "Wie führen Sie einen join mit diesem extra Tabelle, wenn ich nichtDbSet
für Sie?".Zum Glück, Sie brauchen nicht zu erwähnen, das extra-Tabelle in den Anfragen benötigt.
Wenn du eine Abfrage wie "Gib mir alle Clubs', die ... von jeder 'Person', die ..." glaube nicht, dass in den joins. Verwenden Sie stattdessen die ICollections!
Bekommen alle "John Doe" Personen mit all Country clubs, die Sie besuchen:
Entity framework erkennt, dass eine Verknüpfung mit der extra viele-zu-viele-Tabelle ist erforderlich, und wird dieser join ausgeführt wird, ohne Sie zu erwähnen, diese extra Tabelle.
Umgekehrt: Holen Sie sich alle country-clubs mit Ihren "John Doe" Personen:
Habe ich erlebt, dass, sobald ich begann zu denken, die daraus resultierenden Kollektionen, die ich will, anstatt die Verknüpfungen, die ich brauchte, um diese Sammlungen fand ich, dass ich kaum verwenden, die verbindet. Dies ist der Fall für eins-zu-viele Beziehungen, wie auch die viele-zu-viele-Beziehungen. Entity framework intern mit dem richtigen verbindet.
InformationsquelleAutor Harald Coppoolse