(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:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension=".cs"#><#
const string inputFile = @"Model1.edmx";
var textTransform = DynamicTextTransformation.Create(this);
..
..
Etwa 50 Zeilen weiter unten wird der Konstruktorcode geskriptet.
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
<#
}
#>
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
base.Configuration.ProxyCreationEnabled = false;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
}
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
Erstellen - Transformieren Sie alle T4-Vorlagen
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.