Trabajar con entidades de seguimiento propio

En una aplicación Entity Framework , el responsable de realizar el seguimiento de los cambios en las entidades de un gráfico de objetos es un contexto del objeto. Sin embargo, en los escenarios de n niveles, es posible que el contexto del objeto no esté disponible en el nivel que modifica las entidades. 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.

Ff407090.note(es-es,VS.100).gifNota:
Use entidades de seguimiento propio solo si el contexto del objeto no está disponible en un nivel en el que se realicen los cambios en el gráfico del objeto. Si el contexto del objeto está disponible, use los tipos derivados de la clase EntityObject, o tipos de objetos CLR "antiguos" (POCO), o los tipos de proxy POCO. Para obtener más información, vea Trabajar con objetos (Entity Framework).

A partir de Microsoft Visual Studio 2010, la plantilla Generador de entidades de seguimiento propio de ADO.NET genera entidades de seguimiento propio. Este elemento de plantilla genera dos archivos .tt (plantilla de texto): <nombre de modelo>.tt y <nombre de modelo>.Context.tt. El archivo <nombre de modelo>.tt genera los tipos de entidad y una clase auxiliar que contiene la lógica del seguimiento de cambios que utilizan las entidades con seguimiento propio y los métodos de extensión que permiten establecer el estado de las entidades de seguimiento propio. El archivo <nombre de modelo>.Context.tt genera una clase ObjectContext con tipo y una clase de extensión que contiene los métodos ApplyChanges para las clases ObjectContext y ObjectSet. Estos métodos examinan la información del seguimiento de cambios contenida en el grafo de entidades con seguimiento propio para deducir el conjunto de operaciones que se deben realizar con el fin de guardar los cambios en la base de datos. Para obtener más información, vea ADO.NET Self-Tracking Entity Generator Template.

Ff407090.Important(es-es,VS.100).gif Nota:
Un servicio no debería confiar en solicitudes de recuperación o actualización de datos que proceden de un cliente que no es de plena confianza o transmitidas a través de un canal que no es de plena confianza. Se debe autenticar un cliente: es necesario utilizar un canal seguro o la envoltura de mensajes. Se deben validar las solicitudes de los clientes de actualización o recuperación de datos para asegurarse de que se ajustan a los cambios legítimos y previstos del escenario dado.

Ff407090.Important(es-es,VS.100).gif Nota:
Evite utilizar información confidencial como claves de entidad (por ejemplo, números de seguridad social). Esto reduce la posibilidad de que pueda serializarse de forma inadvertida información confidencial en los grafos de entidades con seguimiento propio de un cliente que no es de plena confianza. Con asociaciones independientes, se podría enviar también al cliente la clave original de una entidad que esté relacionada con la que se está serializando.

Métodos de extensión de entidades con seguimiento propio

Se pueden aplicar los siguientes métodos de extensión a una entidad con seguimiento propio. Si desea realizar estas operaciones en un conjunto de entidades en vez de en una solo, vea el artículo relacionado con trabajar con conjuntos de entidades de seguimiento propio para obtener más información.

Método StartTracking

El método StartTracking indica a la herramienta de seguimiento de cambios de la entidad que comience a registrar todos los cambios aplicados a la entidad. Esto incluye los cambios en las propiedades escalares, las recopilaciones y las referencias a otras entidades. Las entidades de seguimiento propio inician el seguimiento de forma automática cuando se deserializan en el cliente a través de Windows Communication Foundation (WCF). El seguimiento también se activa para las entidades creadas recientemente en los siguientes escenarios:

  • Se crea una relación entre la nueva entidad y una entidad que ya está realizando el seguimiento de los cambios.

  • Se llama al método MarkAs[State] o al método AcceptChanges en una entidad.

Método StopTracking

El método StopTracking detiene los registros de cambios.

Métodos MarkAs

Todos los métodos MarkAs activan el seguimiento. Estos métodos de extensión facilitan los cambios de estado de una entidad de forma explícita a Added, Modified, Deleted y Unchanged.

Los métodos MarkAs[State] devuelven la misma entidad a la que se aplican, con el estado modificado. En el siguiente ejemplo se modifica el estado de la entidad a Unchanged:

department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();

El método MarkAsAdded cambia el estado de la entidad a Added. Las nuevas entidades de seguimiento propio se crean con el estado Added sin el seguimiento de cambios habilitado.

El método MarkAsDeleted cambia el estado de la entidad a Deleted. Además, este método borra las propiedades de navegación de la entidad que se marca para su eliminación. La propiedad de navegación se establece en null si señala a un objeto de referencia. Se llama al método Clear si la propiedad de navegación representa una colección. Cuando se llama a MarkAsDeleted en un objeto que forma parte de una colección, el objeto se quita de la colección. Para marcar todos los objetos de una colección como eliminados, márquelos en una copia de la colección. Para obtener la copia de la colección, llame al método ToArray() o al método ToList() de la colección, como en el siguiente ejemplo:

List<Course> courses = department.Courses.ToList();

foreach (var c in courses)

{

// Mark each course in the department as Deleted.

c.MarkAsDeleted();

}

El método MarkAsModified cambia el estado de la entidad a Modified. Asimismo, si se modifica el valor de una propiedad en una entidad que tenga habilitado el seguimiento de cambios, el estado se establece en Modified.

El método MarkAsUnchanged cambia el estado de la entidad a Unchanged. Asimismo, AcceptChanges borra la información de seguimiento de cambios de una entidad y cambia su estado a Unchanged.

AcceptChanges

El métodoAcceptChanges borra la información de seguimiento de cambios de una entidad y cambia su estado a Unchanged. Si desea restablecer el estado de una relación, llame a AcceptChanges en las dos entidades que participen en la relación.

Métodos de extensión ObjectContext

El método ApplyChanges examina la información de seguimiento de cambios contenida en el 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. Hay dos métodos ApplyChanges, uno para ObjectContext y otro para ObjectSet.

Ff407090.note(es-es,VS.100).gifNota:
Para evitar propagar mensajes de excepción con datos confidenciales en el nivel de cliente, las llamadas a ApplyChanges y SaveChanges en el nivel del servidor se deben encapsular en un código de control de excepciones.

Consideraciones al trabajar con entidades de seguimiento propio

Tenga en cuenta lo siguiente al trabajar con entidades de seguimiento propio:

  • Asegúrese de que el proyecto cliente tenga una referencia al ensamblado con los tipos de entidad. Si agrega solo la referencia de servicio al proyecto cliente, este proyecto usará los tipos de proxy WCF y no los tipos reales de entidad de seguimiento propio. Es decir, no obtendrá las características de notificación automatizadas que administran el seguimiento de las entidades en el cliente. Si, a propósito, no desea incluir los tipos de entidad, deberá establecer manualmente la información de seguimiento de cambios en el cliente de los cambios que se van a devolver al servicio.

  • Las llamadas a la operación de servicio no deben tener estado y deben crear una nueva instancia del contexto del objeto. Asimismo, se recomienda que se cree el contexto del objeto en un bloque using.

  • Si envía el gráfico modificado en el cliente al servicio y, a continuación, planea seguir trabajando con el mismo gráfico en el cliente, debe iterar manualmente el gráfico y llamar al método AcceptChanges de cada objeto para restablecer la herramienta de seguimiento de cambios. Si los objetos del gráfico contienen propiedades con valores generados por la base de datos (por ejemplo, valores de identidad o simultaneidad), Entity Framework reemplazará los valores de estas propiedades por los valores generados por la base de datos después de llamar al método SaveChanges. Puede implementar la operación del servicio para que devuelva objetos guardados o una lista de los valores de propiedad generados de los objetos devueltos al cliente. El cliente debe reemplazar las instancias del objeto o los valores de propiedad del objeto con los objetos o los valores de propiedad devueltos desde la operación de servicio.

  • Si se combinan gráficos de varias solicitudes de servicio, se pueden presentar objetos con valores de clave duplicada en el gráfico resultante. Entity Framework no quita los objetos con claves duplicadas cuando llame al método ApplyChanges, sino que produce una excepción en su lugar. Para evitar tener gráficos con valores de clave duplicada siga uno de los modelos descritos en el siguiente blog relacionado con las: entidades de seguimiento propio: ApplyChanges y entidades duplicadas.

  • Cuando se cambia la relación entre objetos mediante el establecimiento de la propiedad de clave externa, la propiedad de navegación de referencia se establece en NULL y no se sincroniza con la entidad de seguridad adecuada en el cliente. Después de adjuntar el gráfico al contexto del objeto (por ejemplo, después de llamar al método ApplyChanges), se sincronizan las propiedades de clave externa y de navegación.

    No disponer de ninguna propiedad de navegación de referencia sincronizada con el objeto principal adecuado podría representar un problema si ha especificado la eliminación en cascada en la relación de clave externa. Si elimina la entidad de seguridad, la eliminación no se propagará a los objetos dependientes. Si ha especificado eliminaciones en cascada, use las propiedades de navegación para cambiar las relaciones en vez de establecer la propiedad de clave externa.

  • Las entidades con seguimiento propio no están habilitadas para realizar una carga diferida.

  • El código generado en la plantilla Generador de entidades de seguimiento propio ADO.NET no admite la serialización binaria ni la serialización en objetos de administración de estado de ASP.NET. Sin embargo, puede personalizar la plantilla para agregar la compatibilidad de serialización binaria. Para obtener más información, vea Uso de la serialización binaria y ViewState con entidades de seguimiento propio.

Vea también

Tareas

Tutorial: Serializar entidades de seguimiento propio (Entity Framework)

Otros recursos

Trabajar con conjuntos de entidades de seguimiento propio
Entidades de seguimiento propio de Silverlight
Uso de la serialización binaria y ViewState con entidades de seguimiento propio