Ich habe das folgende Modell:
%Vor%Aber Entity Framework gibt mir den Fehler:
Der abstrakte Typ AbstractBase hat keine zugeordneten Nachkommen und kann daher nicht zugeordnet werden
Meiner Meinung nach sollte dies nicht passieren, da AbstractBase direkt von AbstractBase erbt und die von Concrete1 / 2 konkret geerbten Klassen von GenericAbstractBase. Was ist hier los?
Ich frage mich auch, ob die Eigenschaft des Typs T in GenericAbstractBase von EF beibehalten wird, nur für den Fall, dass jemand, der vorbeikommt, die Antwort im Hinterkopf hat.
Update 1
Kann jemand bestätigen, dass dies von EF unterstützt wird? Ich habe das gesehen posten und laut Rowans Antwort sollte dies der Fall sein. Danke
Update 2 Gleiches Problem, wenn die generische Basisklasse nicht abstrakt ist.
Hier ist die Antwort vom EF-Team :
EDM, das zugrunde liegende Metamodell, das von der EF6-Laufzeit verwendet wird, um darüber nachzudenken Die Entitätstypen unterstützen keine Generika. Wir erlauben nicht-generische Entitätstypen, die von allgemeinen generischen Typen erben, die hinzugefügt werden sollen Modelle, aber wenn wir die Vererbungshierarchien hinaufgehen, hören wir auf zu schauen sobald wir einen generischen Vorfahren getroffen haben. Du benutzt das normalerweise Fähigkeit, die Form Ihrer Entity-Typen unter Verwendung des vollständigen Modells zu modellieren Ausdruck von Vererbung und Generika auf der CLR - Seite von auf der EF-Seite führt dies jedoch zu nicht verwandten Entitätstypen hinzugefügt werden.
Auf diese Weise haben Sie Ihren DbContext definiert, aus der Perspektive der EF6-Laufzeit fügen Sie drei verschiedene und nicht verwandte Entitätstypen hinzu: AbstractBase, Concrete1 und Concrete2. Alle generischen Typen in der Mitte der Hierarchie wurden ignoriert und deshalb EF nicht weiß, dass sie verwandt sind.
Mit dieser Einschränkung ist die Ausnahme, die Sie bekommen, erwartet, da AbstractBase abstrakt ist und keine hat konkrete Nachkommen wissen zu EF. Wenn Sie ein separates nicht-generisches und hinzufügen konkreter Typ, der direkt von AbstractBase erbt, z. B .:
%Vor%Ihr Modell sollte wieder gültig sein. Sie können jedoch nicht verwenden MyContext.AbstractBase zum Starten von Abfragen, die Instanzen von Concrete1 oder Concrete2, da EF die Tatsache nicht kennt, dass sie es sind verwandt.
Übrigens haben wir in EF7 die EDM-Schicht für die Implementierung losgeworden von EF und wir erwarten, mehr und mehr Szenarien für tatsächliche generische Entitätstypen.
Hoffe, das erklärt, was vor sich geht.
Diego
Ich fand die Lösung, die Gil Fink im CodeProject-Artikel, Spreading Inheritance, zur Verfügung gestellt hat Tree Mapping über Assemblys in Code First .
Die Lösung des Problems besteht darin, allen Entitäten im Kontext eine Zuordnung hinzuzufügen. Um dies zu tun, müssen Sie die OnModelCreating-Methode überschreiben und alle Entitäten zuordnen:
%Vor%Tags und Links c# entity-framework