Plantilla Generador de EntityObject de ADO.NET

En este tema se proporciona información general sobre la plantilla Generador de EntityObject de ADO.NET que se incluye con Visual Studio 2010. En el tema también se muestra cómo personalizar la plantilla de texto. La plantilla Generador de EntityObject de ADO.NET genera las clases de entidad derivada ObjectContext y EntityObject con tipo (código de nivel de objeto).

La plantilla Generador de EntityObject de ADO.NET genera el mismo código que el código predeterminado que genera Entity Designer. La plantilla Generador de EntityObject de ADO.NET consta de un archivo de plantilla de texto: <nombre de modelo>.tt. La plantilla <nombre de modelo>.tt genera un archivo de código fuente, <nombre de modelo>.cs (o .vb), que aparece bajo <nombre de modelo>.tt en el Explorador de soluciones.

Información general sobre el código de archivo <nombre de modelo>.tt

En primer lugar, el código utiliza directivas integradas para indicar al motor de procesamiento de plantillas de texto cómo procesar la plantilla. La plantilla de texto incluye el archivo .ttinclude que contiene clases de utilidad que ayudan con el proceso de generación de código. Para obtener más información acerca del archivo .ttinclude, vea Archivo .ttinclude de la utilidad 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"#>

A continuación, crea una instancia del tipo UserSettings que permite al usuario especificar cómo se escribirá el código. Por ejemplo, este tipo determina si se usan las mayúsculas y minúsculas como en Camel para los nombres de campo o si los métodos AddTo se agregan a la clase de contexto del objeto con tipo en el código generado.

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

A continuación, el código crea instancias e inicializa las clases auxiliares definidas en el archivo .ttinclude. También se inicializan algunas variables locales.

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

Después de la inicialización, se usa una mezcla de bloques de texto y bloques de código para generar el texto del archivo de salida. Los bucles foreach (For Each en Visual Basic) se utilizan para escribir el texto que se basa en la información de metadatos devuelta por la función auxiliar GetSourceSchemaTypes. La función auxiliar GetSourceSchemaTypes se define en <nombre de modelo>.tt y llama el método GetItems para obtener todos los elementos del tipo especificado de esta colección de elementos. A continuación, figura una descripción del código que se escribe en el archivo <nombre de modelo>.cs o <nombre de modelo>.vb:

  1. Metadatos de relaciones de EDM.

  2. La definición de la clase ObjectContext con tipo. La definición de clase incluye: sobrecargas de constructor, propiedades ObjectSet, métodos AddTo (si UserSettings.CreateContextAddToMethods se establece en true) y métodos de importación de función (si se define alguno en el modelo conceptual).

    El siguiente código del archivo <nombre de modelo>.tt escribe la clase ObjectContext con tipo.

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

    Si el nombre del contenedor es SchoolEntities, se generará el siguiente código en el archivo <nombre de modelo>.cs o <nombre de modelo>.vb:

    Public Partial Class SchoolEntities
        Inherits ObjectContext
    
    public partial class SchoolEntities : ObjectContext
    
  3. Clases de tipo de entidad. Estas clases se derivan de EntityObject e incluyen atributos que definen cómo se asignan tipos de entidad del nivel de objeto a los tipos de entidad del modelo conceptual. La definición de clases de entidad incluye métodos de generador y primitivos, complejos, así como propiedades de navegación.

  4. Clases de tipos complejos. Estas clases se derivan de ComplexObject e incluyen atributos que definen cómo se asignan tipos complejos del nivel de objeto a los tipos complejos del modelo conceptual.

A continuación, se definen las funciones auxiliares. En las plantillas de texto, las funciones auxiliares están incluidas entre bloques de características de clase. Asigne etiquetas de característica de clase utilizando <#+ y #>.

Personalizar el código de nivel de objeto

Si desea personalizar la forma en que se genera el código de nivel de objeto, deberá modificar el archivo .tt. Puede que desee modificar el nombre del contexto del objeto con tipo; agregar nuevas propiedades o modificar las existentes o los atributos de los tipos de entidad, o hacer que el tipo de entidad se herede de alguna interfaz. Para personalizar el código de nivel de objeto, puede modificar los bloques de texto en el archivo .tt (el bloque de texto está fuera de las etiquetas #> y <#).

Para cambiar el nombre del contexto del objeto con tipo, agregue la palabra (por ejemplo, My) delante de todas las apariciones de <#=code.Escape(container)#>. Entonces, si en el archivo .edmx el nombre del contenedor es SchoolEntities, en el código generado el nombre del contenedor será MySchoolEntities.

También puede personalizar el código generado cambiando los valores de los campos del tipo UserSettings. Por ejemplo, establezca FullyQualifySystemTypes en false si no desea que el código generado tenga los tipos de sistema completos.

Para obtener más información, vea Cómo: Personalizar la generación de código de nivel de objeto (Entity Data Model Designer).