Ich versuche die Vererbungszuordnungen in EF4 zu verstehen.
Meine Datenbank hat zwei Tabellen mit der folgenden Struktur:
PersonCategory-Tabelle:
Personentabelle
PersonCategory-Tabelle hat vier Einträge, die jeweils eine Kategorie darstellen - Student, CourseInstructor, Staff und Advisor.
Aus dem Lesen Artikeln online dachte ich Tabelle pro Hierarchie ist ein geeignetes Modell für dieses Szenario. In EF4 habe ich also vier Entitäten (Student, CourseInstructor, Staff und Advisor) erstellt, die jeweils von der Person-Tabelle übernommen wurden. Ich habe dann jeden von ihnen der Tabelle Person zugeordnet und eine Bedingung hinzugefügt (z. B. CategoryID = 1 für die Entität Student und CategoryID = 2 für die Entität Staff), um sie von anderen zu unterscheiden. Ich habe auch die CategoryID-Eigenschaft aus der Person-Tabelle entfernt und sie zur abstrakten Klasse gemacht. Aber ich erhalte den folgenden Fehler, weil ich die CategoryId-Eigenschaft aus Person-Tabelle gelöscht habe.
Fehler 3015: Problem bei der Zuordnung von Fragmenten ab Zeile 101, 108, 114, 120, 126, 133: Fremdschlüsselabhängigkeit 'FK_Person_PersonCategory' von Tabelle Person (CategoryID) bis Tabelle PersonCategory (CategoryID) :: Unzureichende Zuordnung: Fremdschlüssel muss einem AssociationSet oder EntitySets zugeordnet werden, die konzeptionell an einer Fremdschlüsselzuordnung teilnehmen.
Ist die Tabelle pro Hierarchie ein geeignetes Modell für dieses Szenario? Wenn nicht, wie sollte ich dieses Szenario in EF4 angehen?
Die Verwendung von Diskriminatorspalten in Assoziationen ist problematisch. Siehe: -
"Der entscheidende Punkt ist, dass eine Spalte, die als Diskriminator fungiert, nur dann einer Assoziation zugeordnet werden kann, wenn sie in einer Nicht-Null-Bedingung enthalten ist."
Für Tabelle-für-Hierarchie enthält eine einzelne Tabelle alle Spalten für alle Typen. Du hast zwei Tische, also bin ich sofort misstrauisch.
Wenn Sie sich für Tabelle-pro-Typ entscheiden, ist es auch nicht richtig. Sie könnten nur zwei Typen haben, Basis und abgeleitet, wobei die PersonCategory-Tabelle die Daten für die Eigenschaftswerte des abgeleiteten Typs liefert. Aber das müsste die PersonID als Fremdschlüssel haben, was nicht der Fall ist.
Ich persönlich denke, dass Sie Ihre Entitäten unnötig in verschiedene Typen zerlegen. Sie könnten alle Spalten aus beiden Tabellen einer Entität zuordnen oder, wenn möglich, das Datenbankschema besser an Ihre Anforderungen anpassen.
Ich würde vorschlagen, mit einer leeren Testdatenbank zu arbeiten und TPT- und TPH-Model-First-Designs zu erstellen und sich das Schema anzuschauen, das EF für Ihr gewünschtes Setup erstellt.
Lukas
Tags und Links .net inheritance entity-framework-4 hierarchy table-per-hierarchy