Trabajar con entidades POCO (Entity Framework)

Entity Framework permite utilizar clases de datos personalizadas junto con su modelo de datos sin realizar ninguna modificación en las clases de datos. Esto significa que podrá utilizar objetos CLR "antiguos" (POCO), tales como objetos de dominio existentes, con el modelo de datos. Estas clases de datos POCO (también conocidos como objetos que ignoran la persistencia), asignadas a entidades definidas en un modelo de datos, admiten la mayoría de los mismos comportamientos de consulta, inserción, actualización y eliminación que los tipos de entidad generados por las herramientas Entity Data Model .

Requisitos de la asignación

Para utilizar entidades POCO con un modelo de datos, el nombre del tipo de entidad debe ser igual que la clase de datos personalizada, y cada propiedad del tipo de entidad debe asignarse a una propiedad pública de la clase de datos personalizada. Los nombres de los tipos y de cada una de las propiedades asignadas deben ser equivalentes. Para obtener información sobre cómo modificar entidades en un modelo conceptual, vea How to: Create and Modify Entity Types.

Dd456853.note(es-es,VS.100).gifNota:
No se admite la asignación de entidades POCO si existen atributos de asignación aplicados a clases de datos personalizadas, incluido el atributo EdmSchemaAttribute en el nivel de ensamblado.

Puede utilizar la plantilla POCO para generar tipos de entidad que omiten la persistencia a partir de un modelo conceptual. La plantilla no está incluida con Visual Studio pero se puede descargar desde la galería de Visual Studio.

Creación de objetos proxy

Si desea que Entity Framework realice un seguimiento de los cambios en sus clases POCO a medida que se producen y admita la carga diferida de los objetos relacionados, las clases POCO deben cumplir los requisitos descritos en el tema Requisitos para crear objetos proxy POCO (Entity Framework).

Cuando la creación de objetos proxy está habilitada para las entidades POCO, Entity Framework realiza automáticamente el seguimiento de los cambios que se realizan en el grafo y en los valores de propiedad de los objetos a medida que se producen. Para obtener más información sobre las opciones de seguimiento de cambios con y sin objetos proxy, vea Realizar el seguimiento de los cambios en entidades POCO (Entity Framework).

Puede utilizar una combinación de entidades POCO y objetos entidad proxy. Para deshabilitar la creación de objetos proxy, establezca el valor de la propiedad ProxyCreationEnabled en false en la instancia de ObjectContextOptions devuelta por la propiedad ContextOptions del ObjectContext.

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

Para obtener más información, vea Cómo: Crear una entidad POCO con objetos proxy (Entity Framework).

Serializar tipos proxy POCO

Windows Communication Foundation (WCF) no puede serializar o deserializar los tipos proxy directamente, ya que DataContractSerializer solo puede serializar y deserializar tipos conocidos, y los tipos proxy no son tipos conocidos. Cuando necesite serializar entidades POCO, deshabilite la creación de objetos proxy o utilice la clase ProxyDataContractResolver para serializar los objetos proxy como entidades POCO originales. Para deshabilitar la creación de objetos proxy, establezca la propiedad ProxyCreationEnabled en false.

La clase ProxyDataContractResolver asigna los tipos proxy a tipos POCO durante la serialización. Para indicarle al DataContractSerializer que utilice la clase ProxyDataContractResolver en las operaciones de servicio, defina una clase de atributos (la cual se aplicará a las operaciones de servicio) que use internamente ProxyDataContractResolver para asignar los tipos proxy a los tipos POCO puros. Asocie esta clase de atributos a los métodos que forman parte de un contrato de servicios en su aplicación WCF.

El cliente recibirá y deserializará las entidades POCO reales. Estas clases no tendrán las capacidades de seguimiento de cambios y carga diferida de los objetos proxy. Para realizar un seguimiento de cambios en estas entidades entre los diferentes niveles, utilice entidades con seguimiento propio. Las entidades con seguimiento propio son entidades POCO que no tienen una dependencia sobre Entity Framework y que contienen su propia lógica de seguimiento de cambios. Para obtener más información, vea Tutorial: Serializar entidades de seguimiento propio (Entity Framework).

Para obtener más información, vea Tutorial: Serializar objetos proxy POCO con WCF (Entity Framework).

Los objetos proxy se pueden serializar y deserializar mediante serialización binaria. Sin embargo, al serializar un gráfico de objetos entre límites de AppDomain, debe asegurarse de que las definiciones de tipos proxy existen en el entorno de destino. Si los tipos no existen, se producirá un error en la deserialización. Para asegurarse de que el tipo existe, utilice CreateProxyTypes.

Dd456853.note(es-es,VS.100).gifNota:
Aunque se cree un objeto de un tipo proxy, no tendrá las capacidades de seguimiento de cambios y carga diferida de un proxy.

Con la serialización binaria y la serialización de contrato de datos, los objetos relacionados se serializan juntos con el objeto principal. La carga diferida realiza una consulta para cada propiedad de navegación de la relación a la que se obtiene acceso, y tanto el serializador binario como el serializador de contrato de datos de WCF obtienen acceso a todas las propiedades de navegación de la relación. Esto puede hacer que se ejecuten muchas consultas inesperadas durante la serialización. Si no deshabilita la generación de tipos proxy (lo cual deshabilitaría la carga diferida), deshabilite explícitamente la carga diferida, como en el siguiente ejemplo.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

Para obtener más información, vea Serializar objetos (Entity Framework).

Resumen de las API específicas para tipos proxy

Las siguientes API se utilizan para trabajar con objetos proxy POCO:

Miembro Descripción

CreateObject

Crea un nuevo objeto proxy POCO si la clase POCO cumple los requisitos descritos en el tema Requisitos para crear objetos proxy POCO (Entity Framework) y la propiedad ProxyCreationEnabled está establecida en true; de lo contrario, crea un objeto de tipo de argumento genérico. El argumento genérico de este método puede ser cualquier tipo de referencia concreto (no se admiten clases abstractas, interfaces y tipos de valor). Si el tipo genérico es un tipo de CLR sin asignación al modelo conceptual, o un tipo que no cumple los requisitos para la creación de proxy, el método intentará utilizar cualquier constructor sin parámetros del tipo pasado para crear y devolver una nueva instancia del tipo. Además del método CreateObject sobre ObjectContext, puede utilizar los métodos CreateObject y CreateObject sobre ObjectSet. Para obtener más información, vea Cómo: Crear una entidad POCO con objetos proxy (Entity Framework).

Este método no agrega el objeto creado al contexto del objeto. Para agregar el objeto al contexto, es necesario utilizar los métodos descritos en el tema Crear, agregar, modificar y eliminar objetos (Entity Framework).

ProxyCreationEnabled

Con esta marca establecida en true, el Entity Framework intentará crear objetos proxy para las entidades POCO. De manera predeterminada, la marca ProxyCreationEnabled presenta el valor true.

GetObjectType

System.Data.Objects.ObjectContext.GetObjectType(System.Type) es un método estático que devuelve el tipo POCO del que se deriva el proxy especificado, si se pasó un tipo proxy como argumento. Si se pasó un tipo que no es proxy, este método devuelve el mismo tipo.

CreateProxyTypes

Crea un conjunto de tipos proxy para los tipos POCO especificados según los metadatos cargados en el ObjectContext. Este método no crea objetos de los tipos de proxy creados. Por ejemplo, en el siguiente código se crean tipos proxy para las clases POCO Customer y Order: context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

Al cargar objetos desde el origen de datos o crear nuevos objetos con CreateObject, el Entity Framework crea tipos proxy para las clases POCO en tiempo de ejecución. Sin embargo, podrían existir casos en los que desee crear los tipos proxy de antemano. Por ejemplo, al serializar un gráfico de objetos entre límites de AppDomain, quizá desee asegurarse de que los tipos proxy existen realmente en el entorno de destino. Si los tipos no existen, se producirá un error en la deserialización.

GetKnownProxyTypes

GetKnownProxyTypes es un método estático que devuelve una enumeración con todos los tipos proxy creados hasta el momento en el AppDomain. En escenarios de serialización, el método se puede utilizar para obtener todos los tipos que el entorno de destino ya debería contener y que el serializador debería reconocer.

En esta sección

Requisitos para crear objetos proxy POCO (Entity Framework)

Cargar entidades POCO relacionadas (Entity Framework)

Realizar el seguimiento de los cambios en entidades POCO (Entity Framework)

Cómo: Definir entidades POCO (Entity Framework)

Cómo: Definir un contexto del objeto personalizado (Entity Framework)

Cómo: Personalizar archivos de asignación y modelado para trabajar con objetos personalizados (Entity Framework)

Cómo: Definir un contexto del objeto personalizado (Entity Framework)

Cómo: Crear una entidad POCO con objetos proxy (Entity Framework)

Cómo: Cargar explícitamente entidades POCO (Entity Framework)

Cómo: Detectar cambios en entidades POCO

Cómo: Cambiar las relaciones entre entidades POCO (Entity Framework)

A continuación se muestra la serie de entradas de blog sobre POCO de ADO.NET.

POCO

POCO en Entity Framework 4: parte 2

POCO en Entity Framework 4: parte 3

Vea también

Conceptos

Personalizar objetos (Entity Framework)
Definir y administrar relaciones (Entity Framework)