Vorlage "ADO.NET-Entitäts-Generator mit Selbstnachverfolgung"
Dieses Thema bietet eine Übersicht über die in Visual Studio 2010 enthaltene Vorlage ADO.NET-Entitäts-Generator mit Selbstnachverfolgung. Im Rahmen dieses Themas wird zudem die Anpassung der Textvorlage erläutert. Die Vorlage ADO.NET-Entitäts-Generator mit Selbstnachverfolgung generiert den Code auf Objektebene, der aus dem typisierten ObjectContext und den Entitätsklassen besteht, die eine Zustandslogik mit Selbstnachverfolgung enthalten. Verwenden Sie bei der Arbeit mit N-Tier-Anwendungen Entitäten mit Selbstnachverfolgung. Weitere Informationen finden Sie unter Working with Self-Tracking Entities und Walkthrough: Serialize Self-Tracking Entities.
Die Vorlage ADO.NET-Entitäts-Generator mit Selbstnachverfolgung besteht aus zwei Textvorlagendateien: <Modellname>.tt und <Modellname>.Context.tt. Mit der Vorlage <Modellname>.Context.tt wird der typisierte ObjectContext generiert. Mit der Vorlage <Modellname>.tt werden die Entitätstypen mit Selbstnachverfolgung generiert.
Beide Textvorlagen beginnen mit integrierten Direktiven, die das Textvorlagen-Verarbeitungsmodul anweisen, wie die Vorlage verarbeitet werden soll. Beachten Sie, dass die Textvorlagen die TTINCLUDE-Datei beinhalten. Die TTINCLUDE-Datei enthält Hilfsprogrammklassen, die den Codegenerierungsprozess der ADO.NET-Vorlagen unterstützen. Weitere Informationen zur TTINCLUDE-Datei finden Sie unter TTINCLUDE-Datei (Entity Framework-Hilfsprogramm).
<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.VB.ttinclude"#>
<#@ output extension=".vb"#>
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
Anschließend werden die in der TTINCLUDE-Datei definierten Hilfsklassen vom Code instanziiert und initialisiert.
Dim code As New CodeGenerationTools(Me)
Dim ef As New MetadataTools(Me)
Dim loader As New MetadataLoader(Me)
Dim region As New CodeRegion(Me)
Dim fileManager As EntityFrameworkTemplateFileManager = EntityFrameworkTemplateFileManager.Create(Me)
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataTools ef = new MetadataTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this);
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
Mithilfe des Codes wird zudem die Zeichenfolge inputFile initialisiert. Wenn Sie die Vorlagen vom Projekt mit der EDMX-Datei in ein anderes Projekt verschieben, müssen Sie die Zeichenfolge inputFile in den relativen Speicherort der EDMX-Datei ändern.
Dim inputFile As String = "SchoolModel.edmx"
string inputFile = @"SchoolModel.edmx";
In den beiden folgenden Abschnitten werden die von den einzelnen TT-Dateien generierten Elemente ausführlicher erläutert.
<Modellname>.Context.tt
Die Vorlage <Modellname>.Context.tt generiert zwei Quelldateien. Die Quelldateien werden im Projektmappen-Explorer unter der Datei <Modellname>.Context.tt angezeigt.
Eine Datei mit dem Namen <Modellname>.Context.cs (oder .vb). Der generierte Quellcode enthält die Definition für die typisierte ObjectContext-Klasse. Die Definition enthält:
Konstruktorüberladungen. Die Konstruktoren legen die Proxyerstellung auf false fest und registrieren den ObjectMaterializedEventHandler. Informationen zu POCO (Plain Old CLR-Objekte) und Proxyobjekten finden Sie unter Working with POCO Entities.
ObjectSet-Eigenschaften
Funktionsimportmethoden (sofern diese im konzeptionellen Modell definiert wurden)
Eine Datei mit dem Namen <Modellname>.Context.Extensions.cs (oder .vb). Die generierte Quelldatei enthält zwei ApplyChanges-Erweiterungsmethoden (eine für ObjectContext und die andere für ObjectSet) sowie private Methoden, die die ApplyChanges-Methode unterstützen. Die ApplyChanges-Methode untersucht die Änderungsnachverfolgungsinformationen im Diagramm der Entitäten mit Selbstnachverfolgung, um aus diesen Vorgänge abzuleiten, die ausgeführt werden müssen, um die Änderungen in der Datenbank wiederzuspiegeln.
<Modellname>.tt
Mit der Vorlage <Modellname>.tt werden mehrere Quelldateien generiert. Die Quelldateien werden im Projektmappen-Explorer unter der Datei <Modellname>.tt angezeigt.
Eine Datei mit dem Namen <Modellname>.cs (oder .vb), die Folgendes enthält:
Die Definition für die ObjectChangeTracker-Helferklasse. Eine ObjectChangeTracker-Instanz enthält und verfolgt Informationen über alle Änderungen, die an Typen vorgenommen wurden, die IObjectWithChangeTracker implementieren. ObjectChangeTracker ist Teil des Datenvertrags von Objekten mit Selbstnachverfolgung und wird daher mit diesen serialisiert.
Die Definition für die IObjectWithChangeTracker-Schnittstelle. Die Schnittstelle wird von den Entitäten mit Selbstnachverfolgung implementiert und enthält eine einzelne schreibgeschützte Eigenschaft, mit der der ObjectChangeTracker für die Entität abgerufen wird.
Für IObjectWithChangeTracker-Typen definierte Erweiterungsmethoden, die eine Bearbeitung des Entitätszustands mithilfe des ObjectChangeTracker ermöglichen. Im Folgenden finden Sie die Liste der Erweiterungsmethoden: MarkAs[Zustand], StartTracking, StopTracking und AcceptChanges. Weitere Informationen zur Funktionsweise der einzelnen Erweiterungsmethoden finden Sie unter Working with Self-Tracking Entities.
Die Definition für TrackableCollection von T, die von ObservableCollection abgeleitet wird. Alle Entitäten, die über Auflistungsnavigationseigenschaften verfügen, registrieren einen Handler für das CollectionChanged-Ereignis in der TrackableCollection von T für diese Navigationseigenschaft. Der Handler führt die Änderungsnachverfolgung und die Logik aus, mit der beide Enden der Beziehung synchronisiert werden.
Die Definition der INotifyComplexPropertyChanging-Schnittstelle. Die Schnittstelle stellt ein Ereignis bereit, das bei Änderungen an komplexen Eigenschaften auftritt. Bei der Änderung kann es sich entweder um eine Zuweisung einer neuen komplexen Typinstanz zu einer komplexen Eigenschaft oder um eine Änderung an einer skalaren Eigenschaft einer komplexen Typinstanz handeln.
Die Definition der ObjectState-Enumeration. Die ObjectState-Enumeratorliste besteht aus den folgenden Konstanten: Unchanged, Added, Modified und Deleted..
In der Datei sind weitere Typen vorhanden, die verwendet werden, um Zustandsinformationen im ObjectChangeTracker zu speichern. Weitere Informationen finden Sie in der generierten Datei <Modellname>.cs bzw. <Modellname>.vb.
Eine Datei für alle im konzeptionellen Modell definierten Entitäts- und komplexen Typen : <Name des Entitäts- oder komplexen Typs>.cs (oder. vb).
Entitätstypen sind partielle Klassen, die IObjectWithChangeTracker und INotifyPropertyChanged implementieren, um die bidirektionale Datenbindung in Windows Forms, WPF und Silverlight zu unterstützen.
Das DataContract-Attribut wird am Anfang der Klasse hinzugefügt, damit die Klasse serialisiert werden kann. Zudem wird
IsReference = true
im DataContract-Attribut angegeben. Daher handelt es sich bei der Serialisierung für diesen Typ um eine tiefe Serialisierung.Die KnownType-Attribute werden am Anfang der Klasse hinzugefügt. Es gibt ein KnownType-Attribut für jeden Typ, für den dieser Entitätstyp über eine Navigationseigenschaft verfügt.
Die Definition von Entitätsklassen enthält primitive Eigenschaften, komplexe Eigenschaften, Navigationseigenschaften, die ChangeTracker-Eigenschaft und Methoden, die die Beziehungssynchronisierungslogik vereinfachen.
Komplexe Typen sind partielle Klassen, die INotifyComplexPropertyChanging und INotifyPropertyChanged implementieren.
Anpassen des Codes auf Objektebene
Um die Methode anzupassen, mit der der Code auf Objektebene generiert wird, müssen Sie die TT-Datei ändern. Sie können den Namen des typisierten Objektkontexts ändern, Entitätstypen neue oder vorhandene Eigenschaften oder Attribute hinzufügen oder den Entitätstyp von einer Schnittstelle erben.
Um den Code auf Objektebene anzupassen, ändern Sie die Textblöcke in der TT-Datei. Der Textblock wird außerhalb der <#- und #>-Tags definiert. Um den Namen des typisierten Objektkontexts zu ändern, öffnen Sie die Datei <Modellname>.Context.tt, und fügen Sie das Wort (z. B. My
) vor allen Vorkommen von <#=code.Escape(container)#>
ein. Auf diese Weise lautet der Name des Containers SchoolEntities
in der EDMX-Datei im generierten Code MySchoolEntities.
.
Weitere Informationen finden Sie unter Gewusst wie: Anpassen der Generierung von Objektebenencode (Entity Data Model Designer).
Siehe auch
Konzepte
TTINCLUDE-Datei (Entity Framework-Hilfsprogramm)
Weitere Ressourcen
Working with Self-Tracking Entities
Walkthrough: Serialize Self-Tracking Entities