Der einzige Weg, wie mein WCF-Dienst Klassen von einem Code-First-Modell zurückgeben kann, besteht ProxyCreationEnable
darin false
, den folgenden Code zu verwenden.
((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false;
Was sind die negativen Folgen davon? Ein Vorteil ist, dass ich diese dynamischen Typen zumindest serialisieren kann, damit sie mit WCF über das Kabel gesendet werden können.
quelle
Wenn diese Option aktiviert
DbContext.Configuration.ProxyCreationEnabled
istfalse
, lädt DbContext keine untergeordneten Objekte für ein übergeordnetes Objekt, es sei denn, dieInclude
Methode wird für das übergeordnete Objekt aufgerufen. Die EinstellungDbContext.Configuration.LazyLoadingEnabled
auftrue
oderfalse
hat keinen Einfluss auf das Verhalten.Wenn diese Option aktiviert
DbContext.Configuration.ProxyCreationEnabled
isttrue
, werden untergeordnete Objekte automatisch geladen, und derDbContext.Configuration.LazyLoadingEnabled
Wert steuert, wann untergeordnete Objekte geladen werden.quelle
Wenn Sie EF verwenden, wird standardmäßig ein Proxy für Ihre Klasse erstellt. Eine Lösung kann darin bestehen, diese Zeile im Konstruktor Ihrer DbContext-Klasse hinzuzufügen. Ihr Datenmodell wurde von der DbContext-Klasse geerbt, sodass Sie Ihr Modell folgendermaßen bearbeiten können:
Diese Klasse ist in deinem
EF.edmx
Dann imyourmodel.Context.tt
Dannyourmodel.Context.cs
quelle
(Verwenden von Visual Studio 2013 oder höher)
Um zu vermeiden, dass der Klassenkonstruktor in Ihrem EF-Modell jedes Mal bearbeitet wird, wenn Sie das Modell aus der Datenbank aktualisieren oder auf andere Weise die Neuerstellung des Codes auslösen, befindet sich der richtige Ort für die Änderung in der T4-Codedatei, für die Sie verantwortlich sind Erstellen des Modellcodes. Ich hatte vor einigen Jahren ein anderes Problem mit dynamischen Eigenschaften, als ich die zugrunde liegende Mechanik der tatsächlichen Erstellung der Klassen und Eigenschaften verstand. T4 !!! Was für ein Wunder das ist :-D Die T4-Syntax kann zunächst ein wenig einschüchternd sein, daher ist es ratsam, sich über die Syntax zu informieren. Es ist auch eine gute Idee, bei Änderungen SEHR konzentriert zu sein :-)
So! Wenn Sie in Ihr Modell schauen, haben Sie eine .tt-Datei unter Ihrer .edmx-Datei. Diese .tt (T4) -Datei ist das Skript, mit dem Ihre Modellklasse tatsächlich erstellt wird. Das Skript wird jedes Mal automatisch ausgeführt, wenn Sie Ihr Modell erstellen oder einige Änderungen im Modelleditor vornehmen.
Angenommen , Ihr Modelldeskriptor heißt Model1.edmx . Sie haben eine Datei mit dem Namen Model1.Context.tt in der Baumstruktur darunter. Sie sehen auch eine Model1.Context.cs- Datei. Dies ist offensichtlich die eigentliche Codedatei für Ihren Kontext. Diese Datei ist jedoch das Ergebnis der Ausführung der .tt-Skriptdatei ! Es wird vollständig dynamisch erstellt. Also keine Ahnung, es zu bearbeiten.
Öffnen Sie die .tt-Datei und Sie sehen etwas wie:
Etwa 50 Zeilen weiter unten wird der Konstruktorcode geskriptet.
Ich habe die Eigenschaft hinzugefügt
base.Configuration.ProxyCreationEnabled = false;
, damit es die allererste Zeile im Konstruktor ist.Speichern Sie Ihre Datei und öffnen Sie die Datei Model1.Context.cs, um den resultierenden Code anzuzeigen. Wenn Sie die Ausführung des Vorlagenskripts erzwingen möchten, wählen Sie das Menü aus
Es ist leicht zu erkennen, ob Sie einen Fehler in Ihrem T4-Code gemacht haben, da die CS-Datei entweder überhaupt nicht erstellt wird oder offensichtliche Fehler aufweist, wenn Sie sie im Editor öffnen.
quelle