Zuordnung von IEdmEntity zu CLR

8

Ich versuche einen Weg von einem IEdmEntity zum CLR Type in Entity Framework zu finden. Vom Casting zu ObjectContext, um Metadaten zu erhalten. Ich verwende den DataSpace.OCSpace, um Zugriff auf das Mapping zu erhalten. Ich glaube, das ist richtig, aber ich könnte den falschen DataSpace haben, die DataSpaces sind nicht klar in meinem Kopf was macht, auch nach diesem Blog Ссылка .

Am Ende bekomme ich System.Data.Entity.Core.Mapping.MappingBase Objekte zurück, die nicht viel für mich tun. Von dem Debugger scheint es, dass ich Zugang zu dem bekommen könnte, was ich will, aber diese Klassen sind intern markiert und ich kann sie nicht ansprechen.

Mache ich das zu hart oder gibt es keine Möglichkeit, von einem IEdmModel von Entity Framework zurück zu den CLR-Typen zu gelangen, auf die es abgebildet ist?

Code hinzufügen, um zu verdeutlichen, woran ich arbeite und versuche herauszukommen

%Vor%     
CharlesNRice 10.04.2014, 21:25
quelle

4 Antworten

8

Die IEdm * -Schnittstellen, die Sie in Ihrer Frage und Antwort erwähnt haben, werden von Entity Framework selbst nicht verwendet (das EF6 NuGet-Paket hat keine Microsoft.Data.Edm -Abbindung) ), werden jedoch hauptsächlich mit OData-Service-Metadaten (CSDL) verwendet. Da in OData CSDL deklarierte Entitäten nicht unbedingt bestimmten CLR-Klassen zugeordnet sind, können Sie ihre CLR-Typen nur indirekt finden. (Ich denke, diese Verwirrung ist der Grund, warum Andrews EF-only-Antwort davon ausging, dass Sie Zugang zu einem EntityObject hatten.)

Glücklicherweise gibt es bei der Darstellung von EF-Entitäten über OData normalerweise eine 1: 1-Übereinstimmung zwischen den vollständigen Namen der Entitäten in der CSDL des OData-Service und des EF-Modells. Angenommen, das ist der Fall, können Sie wie oben mit edmEntityType.FullName suchen, aber Sie müssen zuerst die entsprechende EF EntityType von den Metadaten ObjectContext erhalten.

DataSpace.OCSpace in MetadataWorkspace war ein vernünftiger Ort, um nach dem Mapping zu suchen, da der Object Space & lt; - & gt; Conceptual Space Zuordnungen werden gespeichert. Aber wie Sie entdeckt haben, während die Mapping-API von EF6 angeblich öffentlich ist , ObjectTypeMapping und die zugehörigen Klassen sind immer noch markiert internal : (

Es stellt sich jedoch heraus, dass Sie keine hässlichen Reflexions-Hacks mit den internen OCSpace -Klassen durchführen müssen! Sie können den zugeordneten CLR-Typ direkt von Ihrem 'Treffer' in CSpace wie folgt erhalten:

%Vor%

Sicher, es verwendet die "interne" benutzerdefinierte ClrType-Anmerkungsschlüssel-Zeichenfolge, aber alles wird über die aktuelle öffentliche API ausgeführt. Ich denke, das ist so nah wie möglich an einer 'offiziellen' Lösung, bis der Rest der Mapping-API veröffentlicht wird.

    
rob3c 09.06.2014 20:49
quelle
4

Dies sollte für Entitäts- und Eigenschaftstypen funktionieren.

%Vor%

Verwendung

%Vor%     
codeworx 21.06.2014 13:04
quelle
1

Ich nehme an, dass Sie Entity Framework 6 verwenden, bei dem die Zuordnungs-API nicht öffentlich ist. Bitte werfen Sie einen Blick auf die neue Version von Entity Framework 6.1 RTM:

Ссылка

Genauer gesagt bei der Funktion Public Mapping API:

Ссылка

Sie sollten mit metadataWorkspace spielen, um Informationen zu Entity-Framework-Typen und deren Zuordnung zu erhalten. Beispielsweise können alle einfachen Eigenschaften Ihrer Entität und ihre CLR-Typen wie folgt abgerufen werden:

%Vor%     
Andrew 11.04.2014 12:55
quelle
1

Hier ist, was ich habe, das von meinen begrenzten Tests funktioniert, aber wirklich wie ein Hack aussieht. Hoffe, jemand anderes findet etwas besseres.

%Vor%

Nimmt an, dass die OSpace-Identität mit dem CLR-Namen identisch ist. Außerdem wird davon ausgegangen, dass die ID für den OCSpace die beiden zusammen ist, getrennt durch a:.

    
CharlesNRice 11.04.2014 19:53
quelle

Tags und Links