Crear aplicaciones de n niveles (Entity Framework)

Entity Framework admite la serialización de objetos entidad en formatos que permiten el intercambio remoto y basado en mensajes de objetos entidad, como los que se usan en servicios Web y Windows Communication Foundation (WCF). Los objetos se pueden serializar utilizando la serialización binaria, la serialización XML y la serialización de contrato WCF para el transporte mediante protocolos basados en mensajes o secuencias binarias. Para obtener más información, vea Serializar objetos (Entity Framework). Los objetos también se pueden recibir de un mensaje o una secuencia, deserializar y asociar a un contexto del objeto. Para obtener más información, vea Asociar y desasociar objetos (Entity Framework).

ADO.NET Data Services permite proporcionar acceso dinámico a datos de entidades en formato XML que puede ser utilizado por aplicaciones. Se obtiene acceso a estos datos de entidad mediante acciones HTTP de transferencia de estado de representación (REST) estándar, como GET, PUT y POST. Para obtener más información, vea ADO.NET Data Services.

Las siguientes consideraciones se aplican a servicios Web o servicios WCF que utilizan Entity Framework :

  • Con la serialización binaria y la serialización de contrato de datos, los objetos relacionados se serializan juntos con el objeto principal. La serialización XML no serializa objetos relacionados. Al serializar entidades, deshabilite la carga diferida. 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. Para obtener más información, vea Serializar objetos (Entity Framework).

  • Se recomiendan los servicios sin estado. Los servicios se deben diseñar de modo que un contexto del objeto solo se mantenga para la duración de una solicitud o una respuesta. El modelo de intercambio de mensajes debe incluir información suficiente para que los cambios se puedan aplicar sin tener que conservar los objetos ni volver a consultar el origen de datos para recuperar el objeto original. Por ejemplo, un servicio que permite a un cliente actualizar objetos debe requerir que el objeto actualizado se devuelva junto con el objeto original. Esto permite que el servicio Web aplique cambios al objeto original sin que se tenga que recuperar el objeto original de la base de datos ni conservarlo en memoria. Para obtener más información, vea Cómo aplicar los cambios realizados a un objeto desasociado (Entity Framework).

  • Los objetos siempre se deserializan en estado Detached. Puede que sea necesario asociar o agregar el objeto a un ObjectContext, o puede que solo se desee aplicar cambios de propiedad al objeto original. Para obtener más información, vea Asociar y desasociar objetos (Entity Framework).

  • Una vez que los objetos y las relaciones se han agregado al contexto, puede establecer el nuevo estado utilizando ChangeObjectState (como Added o Modified).

  • Deberá administrar la simultaneidad y la validación manualmente.

Para obtener más información, vea los siguientes artículos sobre desarrollo de n niveles:

Antimodelos

Modelos de aplicación de n niveles

Entidades de seguimiento propio

En una aplicación Entity Framework , el responsable de realizar el seguimiento de los cambios en los objetos es un contexto de objetos. Sin embargo, si necesita manipular objetos en otro nivel, donde el contexto de objetos no está disponible, deberá decidir cómo realizar el seguimiento de cambios y notificar esos cambios al contexto de objetos. A partir de la versión 4 de .NET Framework, las entidades con seguimiento propio pueden ayudarle a realizar el seguimiento de los cambios en cualquier nivel. Una entidad con seguimiento propio es una entidad creada desde una plantilla del Kit de herramientas de transformación de plantillas de texto (T4) que genera tipos de entidad con la capacidad de registrar cambios en las propiedades escalares, complejas y de navegación. Para obtener más información, vea Trabajar con entidades de seguimiento propio.

Para realizar un seguimiento de cambios en un nivel donde los objetos no están asociados a un contexto de objetos sin utilizar entidades con seguimiento propio, puede utilizar los métodos de la siguiente sección como ayuda para actualizar su contexto para conservar los cambios pertinentes en la base de datos.

Trabajar con API relacionadas con el desarrollo de aplicaciones de n niveles

Los siguientes métodos permiten agregar un grafo completo de objetos y, a continuación, recorrer ese grafo, aplicar los valores adecuados a las propiedades del objeto y establecer el estado correcto en los objetos entidad y las relaciones.

Para agregar y asociar entidades, utilice los siguientes métodos:

Miembro Descripción

System.Data.Objects.ObjectSet.AddObject(

o

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

Agrega un objeto y sus objetos relacionados al ObjectContext y establece los objetos entidad en el estado Added. En este estado, no es necesario que los objetos entidad tengan valores de clave únicos. Los valores de clave temporales se asignan a propiedades de clave y se actualizan con los valores generados por el origen de datos después de guardar los objetos. Después de haber agregado los objetos, cambie el estado de los objetos entidad apropiadamente.

System.Data.Objects.ObjectSet.Attach(

o

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

y

AttachTo

Agrega un objeto al ObjectContext y establece el objeto en el estado Unchanged. En el estado Unchanged, Entity Framework trata los valores de clave de entidad como finales. Si más de una entidad de un tipo determinado tiene el mismo valor de clave, Entity Framework producirá una excepción. Para evitar esa excepción, utilice el método AddObject para asociar los objetos desasociados y, a continuación, cambie el estado apropiadamente.

Para cambiar los valores escalares, utilice los siguientes métodos:

Miembro Descripción

System.Data.Objects.ObjectSet.ApplyCurrentValues(

o

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

Toma los valores escalares del objeto proporcionado y los copia en el objeto del ObjectContext que tiene la misma clave. Los valores que difieran de los valores originales se marcarán como modificados.

Si tiene un grafo con valores actuales y desea aplicar los valores originales, llame al método ApplyOriginalValues.

También puede utilizar el método ApplyCurrentValues de ObjectStateEntry.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

o

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

Toma los valores escalares del objeto proporcionado y los copia en el conjunto de valores originales para el objeto del ObjectContext que tiene la misma clave. Los valores que difieran de los valores actuales se marcarán como modificados.

También puede utilizar el método ApplyOriginalValues de ObjectStateEntry.

SetModifiedProperty

Establece las propiedades individuales en el estado Modified. Utilice esta propiedad cuando conozca qué propiedades se modificaron, en lugar de establecer toda la entidad como modificada.

GetUpdatableOriginalValues

Obtiene la instancia de OriginalValueRecord que representa la versión actualizable de los valores originales del objeto que está asociado a este ObjectStateEntry. Utilice la instancia OriginalValueRecord devuelta para leer o actualizar individualmente las propiedades originales del objeto.

CurrentValues

Obtiene la instancia de CurrentValueRecord que representa los valores actuales del objeto que está asociado a este ObjectStateEntry. Utilice la instancia CurrentValueRecord devuelta para leer o actualizar individualmente las propiedades actuales del objeto.

Para cambiar el estado de una entidad y una relación, utilice los siguientes métodos:

Miembro Descripción

ChangeObjectState

Cambia una entidad o una relación a un nuevo estado (como Added o Modified). Este cambio puede tener un impacto en las relaciones en las que una entidad participa. Por ejemplo, al mover una entidad al estado Added, también se moverá cualquier relación sin modificar al estado Added. De igual forma, al marcar una entidad como Modified, también se marcarán los valores escalares como Modified.

También puede utilizar el método ChangeState del ObjectStateEntry.

ChangeRelationshipState

Cambia la relación existente entre dos entidades al estado especificado. Si no existe ninguna relación entre las entidades, este método creará una nueva en el estado especificado. Este método no se admite para relaciones basadas en una asociación de clave externa. Para obtener más información, vea Definir y administrar relaciones (Entity Framework).

También puede utilizar el método ChangeState del ObjectStateEntry.

ChangeState

Este método se comporta igual que ChangeObjectState u ChangeRelationshipState, dependiendo de si ObjectStateEntry es un objeto o una relación.

SetModifiedProperty

Establece las propiedades individuales en el estado Modified. Utilice este método cuando conozca qué propiedades se modificaron, en lugar de establecer toda la entidad como modificada.

Para guardar cambios en el origen de datos, utilice los siguientes métodos:

Miembro Descripción

SaveChanges

Conserva todos los cambios en el origen de datos.

Utilice el evento ObjectMaterialized si desea obtener o establecer alguna información, o suscribirse a algunos eventos, durante la materialización del objeto.

Miembro Descripción

ObjectMaterialized

Se produce cuando se crea un nuevo objeto entidad a partir de datos del origen de datos como parte de una operación de consulta o de carga. El evento se produce una vez cargados los objetos de referencia, pero antes de cargar las colecciones. Si un objeto con el mismo valor de la clave ya existe en el contexto, Entity Framework no volverá a crear el objeto, y no se producirá este evento.

Vea también

Conceptos

Trabajar con objetos (Entity Framework)