Esta documentación está archivada y no tiene mantenimiento.

Plantilla Generador de entidades de seguimiento propio de ADO.NET

Visual Studio 2010

En este tema se proporciona información general sobre la plantilla Generador de entidades de seguimiento propio ADO.NET incluida con Visual Studio 2010. El tema también muestra cómo personalizar la plantilla de texto. La plantilla Generador de entidades de seguimiento propio ADO.NET genera el código de capa de objeto que consta de la clase ObjectContext con tipo y de clases de entidad que contienen lógica de estado de seguimiento propio. Use las entidades de seguimiento propio cuando trabaje con aplicaciones de n capas. Para obtener más información, vea Working with Self-Tracking Entities y Walkthrough: Serialize Self-Tracking Entities.

La plantilla Generador de entidades de seguimiento propio ADO.NET consta de dos archivos de plantilla de texto: <nombre de modelo>.tt y <nombre de modelo>.Context.tt. La plantilla <nombre de modelo>.Context.tt genera la clase ObjectContext con tipo. La plantilla <nombre de modelo>.tt genera los tipos de entidad de seguimiento propio.

Ambas plantillas de texto comienzan con directivas integradas que indican al motor de procesamiento de plantillas de texto cómo procesar la plantilla. Tenga en cuenta que las plantillas de texto incluyen el archivo .ttinclude. El archivo .ttinclude contiene clases de utilidad que ayudan a las plantillas ADO.NET 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="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>

A continuación, el código crea instancias e inicializa las clases auxiliares definidas en el archivo .ttinclude.

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

El código también inicializa la cadena inputFile. Si mueve las plantillas del proyecto que contiene el archivo .edmx a otro proyecto, debe cambiar la cadena inputFile a la ubicación relativa del archivo .edmx.

string inputFile = @"SchoolModel.edmx";

En las dos secciones siguientes se analizan las características de lo que genera cada archivo .tt.

<nombre de modelo>.Context.tt

La plantilla <nombre de modelo>.Context.tt genera dos archivos de código fuente. Los archivos de código fuente aparecen bajo el archivo <nombre de modelo>.Context.tt en el Explorador de soluciones.

  • Un archivo denominado <nombre de modelo>.Context.cs (o vb). El código fuente generado contiene la definición de la clase ObjectContext con tipo. La definición incluye:

    • Sobrecargas de constructor. Los constructores establecen la creación del proxy en false y registran ObjectMaterializedEventHandler. Para obtener información sobre POCO (objetos CLR "antiguos") y objetos proxy, vea Working with POCO Entities.

    • Propiedades de ObjectSet.

    • Métodos de importación de función (si se define alguno en el modelo conceptual).

  • Un archivo denominado <nombre de modelo>.Context.Extensions.cs (o vb). El archivo de código fuente generado contiene dos métodos de extensión ApplyChanges (uno para ObjectContext y el otro para ObjectSet) y métodos privados que admiten el método ApplyChanges. El método ApplyChanges examina la información de seguimiento de cambios del grafo de entidades con seguimiento propio para deducir el conjunto de operaciones que se deben realizar para reflejar los cambios en la base de datos.

<nombre de modelo>.tt

La plantilla <nombre de modelo>.tt genera varios archivos de código fuente. Los archivos de código fuente aparecen bajo el archivo <nombre de modelo>.tt en el Explorador de soluciones.

  • Un archivo denominado <nombre de modelo>.cs (o .vb), que contiene:

    • La definición de la clase auxiliar ObjectChangeTracker. Una instancia de ObjectChangeTracker contiene y realiza el seguimiento de la información relacionada con todos los cambios realizados en los tipos que implementan IObjectWithChangeTracker. ObjectChangeTracker forma parte del contrato de datos de los objetos de seguimiento propio y, por consiguiente, se serializa con ellos.

    • La definición de la interfaz IObjectWithChangeTracker. La interfaz es implementada por las entidades de seguimiento propio y contiene una única propiedad de solo lectura para recuperar el objeto ObjectChangeTracker de una entidad.

    • Los métodos de extensión definidos para los tipos de IObjectWithChangeTracker que permiten manipular el estado de la entidad mediante el objeto ObjectChangeTracker. A continuación figura la lista de los métodos de extensión: MarkAs[State], StartTracking, StopTracking y AcceptChanges. Para obtener información sobre lo que realiza cada método de extensión, vea Working with Self-Tracking Entities.

    • La definición para TrackableCollection de T que se deriva de ObservableCollection. Cada entidad con propiedades de navegación de colección registra un controlador para el evento CollectionChanged en la colección TrackableCollection de T para esa propiedad de navegación. El controlador realiza el seguimiento de los cambios y la lógica que sincroniza los dos extremos de la relación.

    • La definición de la interfaz INotifyComplexPropertyChanging. La interfaz proporciona un evento que se produce cuando las propiedades complejas cambian. El cambio puede ser una asignación de una nueva instancia de tipo complejo a una propiedad compleja o un cambio en una propiedad escalar de una instancia de tipo complejo.

    • La definición de la enumeración ObjectState. La lista de enumeradores ObjectState está compuesta de las siguientes constantes: Unchanged, Added, Modified y Deleted.

    • Hay otros tipos en el archivo que se utilizan para almacenar información sobre el estado dentro de ObjectChangeTracker. Para obtener más información, vea el archivo <nombre de modelo>.cs o <nombre de modelo>.vb generado.

  • Un archivo para cada tipo de entidad y tipo complejo definidos en el modelo conceptual: <nombre de entidad o de tipo complejo>.cs (vb).

    • Los tipos de entidad son clases parciales que implementan IObjectWithChangeTracker e INotifyPropertyChanged (para admitir el enlace de datos bidireccional en Windows Forms, WPF y Silverlight).

      El atributo DataContract se agrega en la parte superior de la clase para permitir serializar la clase. Además, IsReference = true se especifica en el atributo DataContract. Esto significa que la serialización de este tipo es una serialización en profundidad.

      Los atributos KnownType se agregan en la parte superior de la clase. Hay un atributo KnownType para cada tipo con el que este tipo de entidad tenga una propiedad de navegación.

      La definición de clases de entidad incluye lo siguiente: propiedades primitivas, propiedades complejas, propiedades de navegación, la propiedad ChangeTracker y métodos que ayudan con la lógica de sincronización de relaciones.

    • Los tipos complejos son clases parciales que implementan INotifyComplexPropertyChanging e INotifyPropertyChanged.

Personalizar el código de capa de objeto

Para personalizar la forma en que se genera el código de capa de objeto, debe 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 herede de alguna interfaz.

Para personalizar el código de capa de objeto, modifique los bloques de texto del archivo .tt. El bloque de texto se define fuera de las etiquetas #> y <#. Para cambiar el nombre del contexto del objeto con tipo, abra el archivo <nombre de modelo>.Context.tt y agregue la palabra (por ejemplo, My) justo 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.

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

Vea también

Mostrar: