Condividi tramite


Modello ADO.NET EntityObject Generator

In questo argomento viene fornita una panoramica del modello ADO.NET EntityObject Generator incluso in Visual Studio 2010. Viene inoltre illustrato come personalizzare il modello di testo. Il modello ADO.NET EntityObject Generator genera le classi di entità derivate ObjectContext e EntityObject tipizzate (codice del livello oggetti).

Il modello ADO.NET EntityObject Generator genera lo stesso codice del codice predefinito generato da Entity Designer. Il modello di ADO.NET EntityObject Generator è costituito da un file modello di testo: <nome modello>.tt. Il modello <nome modello>.tt restituisce un file di origine, <nome modello.cs>.cs (o .vb) che viene visualizzato sotto <nome modello>.tt in Esplora soluzioni.

Panoramica sul codice file <nome modello>.tt

Il codice utilizza le direttive incorporate che indicano al motore di elaborazione dei modelli come elaborare il modello. Il modello di testo include il file con estensione ttinclude, che contiene classi di utilità che forniscono un supporto per il processo di generazione di codice. Per ulteriori informazioni sul file con estensione ttinclude, vedere File con estensione ttinclude dell'utilità Entity Framework.

<#@ 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"#>

Successivamente crea un'istanza del tipo UserSettings, che consente all'utente di specificare come deve essere scritto il codice. Tale tipo determina ad esempio se per i nomi campo deve essere utilizzato lo stile camel oppure se i metodi AddTo devono essere aggiunti alla classe del contesto dell'oggetto tipizzato nel codice generato.

<#
    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);
#>

Il codice quindi crea un'istanza delle classi di supporto definite nel file con estensione ttinclude e le inizializza. Vengono inizializzate anche alcune variabili locali.

<#
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);
#>

Dopo l'inizializzazione viene utilizzata una combinazione di blocchi di testo e blocchi di codice per generare il testo per il file di output. Vengono utilizzati i cicli foreach (For Each in Visual Basic) per scrivere il testo in base alle informazioni sui metadati restituite dalla funzione di supporto GetSourceSchemaTypes. Viene definita la funzione di supporto GetSourceSchemaTypes nel file <nome modello>.tt e viene chiamato il metodo GetItems per ottenere tutti gli elementi del tipo specificato da questa raccolta di elementi. Di seguito viene descritto il codice che viene scritto nel file <nome modello>.cs oppure <nome modello>.vb:

  1. Metadati delle relazioni EDM.

  2. Definizione della classe ObjectContext tipizzata. La definizione della classe include: overload del costruttore, proprietà ObjectSet, metodi AddTo (se UserSettings.CreateContextAddToMethods viene impostato su true) e metodi di importazione di funzioni, se nel modello concettuale sono definiti metodi.

    Il codice seguente dal file <nome modello>.tt scrive la classe ObjectContext tipizzata.

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

    Se il nome del contenitore è SchoolEntities, nel file <nome modello>.cs o <nome modello>.vb viene generato il codice seguente:

    Public Partial Class SchoolEntities
        Inherits ObjectContext
    
    public partial class SchoolEntities : ObjectContext
    
  3. Classi dei tipi di entità. Tali classi derivano da EntityObject e includono attributi che definiscono il modo in cui i tipi di entità del livello oggetti vengono mappati ai tipi di entità del modello concettuale. La definizione di classi dell'identità include metodi factory e proprietà primitive, complesse e di navigazione.

  4. Classi di tipo complesso. Tali classi derivano da ComplexObject e includono attributi che definiscono il modo in cui i tipi complessi del livello oggetti vengono mappati ai tipi complessi del modello concettuale.

Vengono quindi definite le funzioni di supporto. Nei modelli di testo le funzioni di supporto sono incluse in blocchi di funzionalità di classe. È possibile indicare i tag delle funzionalità di classe con <#+ e #>.

Personalizzazione del codice del livello oggetti

Per personalizzare il modo in cui viene generato il codice del livello oggetti, è necessario modificare il file con estensione tt. È necessario modificare il nome del contesto dell'oggetto tipizzato, aggiungere proprietà o attributi nuovi o modificare quelli esistenti sui tipi di entità oppure fare in modo che il tipo di entità erediti da un'interfaccia. Per personalizzare il codice del livello oggetti, è possibile modificare i blocchi di testo nel file con estensione tt (il blocco di testo è esterno ai tag <# e #> ).

Per modificare il nome del contesto dell'oggetto tipizzato, aggiungere il termine (ad esempio My) prima di tutte le occorrenze di <#=code.Escape(container)#>. Quindi, se nel file con estensione edmx il nome del contenitore è SchoolEntities, nel codice generato il nome del contenitore sarà MySchoolEntities.

È inoltre possibile personalizzare il codice generato modificando i valori dei campi del tipo UserSettings. Impostare ad esempio FullyQualifySystemTypes su false se non si desidera che il codice generato presenti tipi di sistema completi.

Per ulteriori informazioni, vedere Procedura: personalizzare la generazione di codice del livello oggetti (Entity Data Model Designer).