Entity Framework 6.1 Code First Cascading Löschen mit TPH für eine Eins-zu-Eins-Beziehung auf einem abgeleiteten Typ

9

Ich versuche, zwei Eins-zu-eins-Beziehungen zwischen abgeleiteten Klassen einer gemeinsamen Basis und einer nicht verwandten Klasse zu erstellen, sodass beim Löschen der übergeordneten Zeile die untergeordneten Zeilen in der Datenbank gelöscht werden. Ich habe seit einigen Tagen über dieses Thema nachgedacht und jede (für mich) denkbare Kombination von Beziehungen in der fließenden API ausprobiert. Bisher ohne befriedigendes Ergebnis. Das ist mein Setup:

%Vor%

Dies funktioniert bis auf den kaskadierenden Löschteil vollständig. EF erstellt Fremdschlüssel für die Elterntabelle OtherType für jeden referenzierten DerivedType mit DELETE CASCADE. In der untergeordneten Tabelle (TPH = & gt; BaseTypes) wird mit DELETE RESTRICT ein Fremdschlüssel erstellt. Ich würde erwarten, dass die letzten zwei Zeilen in meinem Code die gewünschten Fremdschlüssel mit DELETE CASCADE erstellen würden. Da dies am nächsten ist, um es überhaupt funktionieren zu lassen (und habe keinen meiner früheren Versuche gerettet), werde ich es dabei belassen und hoffen, dass ich alles gut genug erklärt habe, so dass jemand mich in die richtige Richtung weisen kann. Danke!

UPDATE # 1

Ich habe mich jetzt auf die Verwendung von EF TPC konzentriert, in der Hoffnung, dass ich mein Problem auf diese Weise lösen kann. Es hat nicht. Also hier ist zu einem anderen gehen mit ein bisschen mehr Details und eine ERD mein Problem neu zu erklären, in der Hoffnung, dass jemand mir helfen kann, weil ich diesen bestimmten Zustand erreiche, wo Sie anfangen, hysterisch zu lachen, während Sie Ihre Haare ziehen. Das wäre mein EF-Modell:

So habe ich das mit Code First gemacht:

%Vor%

Aus diesem Code wurde dieses Datenbankschema erstellt:

Beide DerivedTypes -Tabellen haben ihren Primärschlüssel, der auch ein Fremdschlüssel ist, der auf BaseTypeId -Column auf BaseTypes verweist.

Um diesen Code zuerst zu erstellen, habe ich die Anweisungen von hier aus verfolgt: - Ссылка
- Ссылка

Ich versuche, Datensätze mit diesem Code in die Datenbank zu schreiben:

%Vor%

EF löst diese Ausnahmebedingungsnachricht aus:

%Vor%

Nun, wie die Lösung für diese unglückliche Situation aussehen sollte, habe ich eine ziemlich gute Vorstellung. Bei der Verwendung von Table-per-Class-Strategy (TPC) muss man sich mit der Generierung von Primärschlüsseln selbst beschäftigen, so dass EF nicht verwirrt wird, wenn man zwei genau gleiche Primärschlüssel für vollständig zusammenhängende Tabellen auf Datenbankebene hat, die aber teilen eine gemeinsame Basisklasse auf der EF-Ebene. Der vorgeschlagene Weg in der ersten URL, die ich verlinkt habe, lindert dieses Problem leider nicht, da die Fremdschlüssel auf meinen DerivedType -Objekten hier gleich bleiben werden, da sie den Primärschlüssel auf der OtherTypes -Tabelle referenzieren Offensichtlich wird dasselbe für eine unterschiedliche Aufzeichnung in dieser Tabelle sein. Das ist das Problem.

Die von mir angenommene Lösung würde zwei zusätzliche Spalten in der Tabelle OtherTypes enthalten, von denen jede das Ziel eines der Fremdschlüssel in den Tabellen DerivedTypes ist. Aber ich weiß absolut nicht, wie ich das in EF umsetzen soll. Was auch immer ich bisher versucht habe, endete normalerweise mit einer Ausnahme darüber, wie man nur hierarchienunabhängige Assoziationen für die am meisten abgeleiteten Typen haben kann (die tatsächlich DerivedTypeA und DerivedTypeB sind) oder andere Validierungsausnahmen, die sich beschweren, dass die Multiplizität% sein muss. co_de% an einer der Beziehungen endet.

Ich muss darauf hinweisen, dass die Art von Modell, das ich erstellt habe, genau das ist, was ich brauche, da ich in einem größeren Modell arbeite, das ein rekursives Marshalling-System und AutoMapper verwendet, um zwischen den beiden Ebenen zu mappen. Das heißt, ich möchte Sie bitten, eine Lösung für das vorgeschlagene Modell zu finden und nicht eine andere Art von Modell oder Workarounds zu entwickeln, wo ich vom many Mapping abweicht.

UPDATE # 2

Ich hatte die Nase voll von EF6s Schwierigkeiten, Assoziationen von abgeleiteten Klassen innerhalb einer Vererbungshierarchie zu anderen Klassen ohne Bezug zu erzeugen, also habe ich mein Datenmodell komplett neu geschrieben, um jede Art von Hierarchie auszuschließen (kein TPH / TPT) / TPC). Ich war in ca. 5 Stunden fertig mit allen Mappings mit flüssiger API und Seeding für die ganze Spanne von Tischen. Cascading löscht die Arbeit genau , während ich sie von überall in meinem Modell einrichte. Dennoch würde ich nicht darauf verzichten, jemandes Lösung für dieses Problem zu hören, aber ich würde weiterleben, für den Fall, dass das nicht gelöst wird.

    
Sven M. 21.04.2014, 20:47
quelle

2 Antworten

0

Ich denke, Ihr Problem hängt mit dem Typ der Navigationseigenschaften in der OtherType-Klasse zusammen.

Ich glaube nicht, dass Sie in diesem Szenario stark typisierte Eigenschaften haben können.

Dies hat eine Ursache in der zyklischen kaskadierten Löschung, die Ihr Modell impliziert.

Als sekundäre Problemumgehung, da Sie bereits eine gefunden haben, versuchen Sie bitte das folgende Modell, das ich in einem ähnlichen Szenario verwendet habe: (mit Person = OtherType, PersonDetail = BaseType, HumanBeing = DerivedTypeA, Corporation = DerivedTypeB)

%Vor%

Der einzige Unterschied zwischen meinem und meinem Modell ist, dass ich mich nicht um den Typ der tatsächlichen Eigenschaft in meiner Person (OtherType) kümmere, da ich immer die Funktion OfType linq verwenden kann, um zu überprüfen, ob Personen in meinen Eigenschaften sind Menschen (DerivedTypeA) oder Corporations (DerivedTypeB).

    
Rogelio Martinez 24.07.2014 21:46
quelle
0

letzte Ausnahmezeile

  

Verwenden Sie die fließende API 'HasDatabaseGeneratedOption' oder   'DatabaseGeneratedAttribute' für die erste Konfiguration des Codes.

Fügen Sie also [key] [DatabaseGenerated (DatabaseGeneratedOption.Identity)] zu ids

hinzu

und Hinzufügen von [ForeignKey ("Spaltenname")] zu den Navigationseigenschaften

Für bessere Anweisungen finden Sie und lesen Sie diese Bücher online:

  • Programmier-Entity-Framework: DbContext, ISBN: 978-1-4493-1296-1
  • Microsoft ADO.NET Entity Framework Schritt für Schritt, ISBN: 978-0-73566-416-6
nkvnkv 11.08.2014 22:05
quelle