Freigeben über


Vorlage "ADO.NET EntityObject Generator"

Dieses Thema enthält eine Übersicht über die in Visual Studio 2010 enthaltene Vorlage ADO.NET EntityObject Generator. Zudem wird erläutert, wie die Textvorlage angepasst wird. Die Vorlage ADO.NET EntityObject Generator generiert die typisierten von ObjectContext und EntityObject abgeleiteten Entitätsklassen (Code auf Objektebene).

Mithilfe der Vorlage ADO.NET EntityObject Generator wird der Code generiert, bei dem es sich auch um den vom Entity Designer generierten Standardcode handelt. Die ADO.NET EntityObject Generator-Vorlage besteht aus einer Textvorlagendatei: "<Modellname>.tt". Die Vorlage "<Modellname>.tt" gibt die Quelldatei "<Modellname>.cs" (oder ".vb") aus, die im Projektmappen-Explorer unter "<Modellname>.tt" angezeigt wird.

Codeübersicht für die Datei "<Modellname>D.tt"

Im Code werden zunächst integrierte Direktiven verwendet, um das Textvorlagen-Verarbeitungsmodul anzuweisen, wie die Vorlage verarbeitet wird. Die Textvorlage beinhaltet die TTINCLUDE-Datei, die Hilfsprogrammklassen enthält, die beim Codegenerierungsprozess helfen. 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 wird eine Instanz des UserSettings-Typs erstellt, mit dem der Benutzer festlegen kann, wie der Code ausgeschrieben werden soll. Dieser Typ bestimmt z. B., ob für Feldnamen eine Höckerschreibweise verwendet wird oder ob die AddTo-Methoden im generierten Code der typisierten Objektkontextklasse hinzugefügt werden.

<#
    Dim userSettings As UserSettings =
        New UserSettings With _
        { _
            .SourceCsdlPath = "SchoolModel.edmx", _
            .ReferenceCsdlPaths = new string () {}, _
            .FullyQualifySystemTypes = True, _
            .CreateContextAddToMethods = True, _
            .CamelCaseFields = False _
        }

ApplyUserSettings(userSettings)
#>
<#
UserSettings userSettings =
        new UserSettings
        {
            SourceCsdlPath = @"SchoolModel.edmx",
            ReferenceCsdlPaths = new string[] {},
            FullyQualifySystemTypes = true,
            CreateContextAddToMethods = true,
            CamelCaseFields = false,
        };

ApplyUserSettings(userSettings);
#>

Anschließend werden die in der TTINCLUDE-Datei definierten Hilfsklassen vom Code instanziiert und initialisiert. Zudem werden einige lokale Variablen initialisiert.

<#
Dim loader As New MetadataLoader(Me)
Dim ef As New MetadataTools(Me)
Dim region As New CodeRegion(Me)
Dim code As New CodeGenerationTools(Me) With {.FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, .CamelCaseFields = userSettings.CamelCaseFields}

ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray())
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath)
Dim namespaceName As String = code.VsNamespaceSuggestion()
UpdateObjectNamespaceMap(namespaceName)
#>
<#
MetadataLoader loader = new MetadataLoader(this);
MetadataTools ef = new MetadataTools(this);
CodeRegion region = new CodeRegion(this);
CodeGenerationTools code = new CodeGenerationTools(this){FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, CamelCaseFields = userSettings.CamelCaseFields};

ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray());
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath);
string namespaceName = code.VsNamespaceSuggestion();
UpdateObjectNamespaceMap(namespaceName);
#>

Im Anschluss an die Initialisierung wird eine Mischung von Text- und Codeblöcken verwendet, um den Text für die Ausgabedatei zu generieren. Die foreach-Schleifen (For Each in Visual Basic) werden verwendet, um den Text auszuschreiben, der auf den Metadateninformationen basiert, die von der GetSourceSchemaTypes-Hilfsfunktion zurückgegeben werden. Die GetSourceSchemaTypes-Hilfsfunktion wird in der Datei "<Modellname>.tt" definiert und ruft die GetItems-Methode auf, um alle Elemente des angegebenen Typs aus dieser Elementauflistung abzurufen. Im Folgenden finden Sie die Beschreibung des Codes, der für die Datei "<Modellname>.cs" oder "<Modellname>.vb" ausgeschrieben wird:

  1. EDM-Beziehungsmetadaten.

  2. Typisierte ObjectContext-Definition. Die Klassendefinition enthält: Konstruktorüberladungen, ObjectSet-Eigenschaften, AddTo-Methoden (wenn UserSettings.CreateContextAddToMethods auf true festgelegt ist) und Funktionsimportmethoden (sofern im konzeptionellen Modell definiert).

    Der folgende Code aus der Datei "<Modellname>.tt" schreibt die typisierte ObjectContext-Klasse aus.

    <#=Accessibility.ForType(container)#> Partial Class <#=code.Escape(container)#>
        Inherits ObjectContext
    
    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
    

    Wenn der Containername SchoolEntities lautet, wird in der Datei "<Modellname>.cs" oder "<Modellname>.vb" der folgende Code generiert:

    Public Partial Class SchoolEntities
        Inherits ObjectContext
    
    public partial class SchoolEntities : ObjectContext
    
  3. Entitätstypklassen. Diese Klassen werden von EntityObject abgeleitet und schließen Attribute ein, die definieren, wie Entitätstypen auf Objektebene Entitätstypen im konzeptionellen Modell zugeordnet werden. Die Definition von Entitätsklassen beinhaltet Factorymethoden sowie primitive, komplexe und Navigationseigenschaften.

  4. Komplexe Typklassen. Diese Klassen werden von ComplexObject abgeleitet und schließen Attribute ein, die definieren, wie komplexe Typen auf Objektebene komplexen Typen im konzeptionellen Modell zugeordnet werden.

Anschließend werden die Hilfsfunktionen definiert. In Textvorlagen werden die Hilfsfunktionen in Klassenfunktionsblöcken eingeschlossen. Sie bezeichnen die Klassenfunktionstags mithilfe von <#+ und #>.

Anpassen des Codes auf Objektebene

Wenn die Methode zum Generieren des Codes auf Objektebene angepasst werden soll, 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, können Sie die Textblöcke in der TT-Datei ändern (der Textblock befindet sich außerhalb der Tags <# und #>).

Um den Namen des typisierten Objektkontexts zu ändern, fügen Sie vor allen Vorkommen von <#=code.Escape(container)#> das Wort (z. B., My) hinzu. Auf diese Weise lautet der Name des Containers SchoolEntities in der EDMX-Datei im generierten Code MySchoolEntities..

Sie können den generierten Code auch anpassen, indem Sie die Werte der Felder des UserSettings-Typs ändern. Legen Sie beispielsweise FullyQualifySystemTypes auf false fest, wenn der generierte Code nicht über vollqualifizierte Systemtypen verfügen soll.

Weitere Informationen finden Sie unter Gewusst wie: Anpassen der Generierung von Objektebenencode (Entity Data Model Designer).