Resolución de identidades, administración de estados y seguimiento de cambios (Entity Framework)

ObjectContext representa un contenedor para objetos en memoria. El contexto del objeto, con la ayuda de otras clases e interfaces, administra la identidad de un objeto, su estado y los valores originales y actuales de las propiedades del objeto, y realiza el seguimiento de los cambios efectuados en cada objeto en la memoria caché. Para obtener información sobre cómo adjuntar objetos al contexto de objetos, vea Asociar y desasociar objetos (Entity Framework). En este tema se describe cómo el contexto de objetos administra el seguimiento de cambios, la resolución de identidad y la administración de estado.

Seguimiento de los cambios

La información de seguimiento de cambios para el gráfico de objetos se almacena en objetos ObjectStateEntry, que son creados por ObjectContext para cada objeto adjunto. Los objetos ObjectStateEntry almacenan la siguiente información para las entidades:

  • EntityKey que determina la identidad de una entidad.

  • EntityState para el objeto.

  • Información sobre los objetos relacionados.

  • El nombre del conjunto de entidades.

  • CurrentValues y OriginalValues de las propiedades de la entidad (los objetos con un estado Added no tienen valores originales).

  • Los nombres de las propiedades modificadas de la entidad.

Para descubrir si el valor de una propiedad ha cambiado entre las llamadas a SaveChanges, consulte la colección de nombres de propiedades cambiadas que devuelve el método GetModifiedProperties.

Bb896269.note(es-es,VS.100).gifNota:
Si está trabajando con entidades POCO sin proxies de seguimiento de cambios, debe llamar a DetectChanges antes de llamar a GetModifiedProperties.

Al desasociar una entidad, el objeto ObjectStateEntry correspondiente se quita del contexto del objeto.

El ObjectStateManager administra los objetos ObjectStateEntry. Hay una instancia de ObjectStateManager por contexto del objeto. Para obtener el objeto ObjectStateEntry para la entidad especificada, utilice uno de los siguientes métodos en ObjectStateManager: TryGetObjectStateEntry, GetObjectStateEntry o GetObjectStateEntries.

Los cambios realizados a las propiedades de las entidades generadas por Entity Framework y los objetos proxy de seguimiento de cambios POCO se notifican al contexto de objetos cuando se producen, y se actualiza el estado de los objetos y los valores de las propiedades en ObjectStateEntry. El modelo de notificación de cambios implica notificar un cambio pendiente en una propiedad, establecer la propiedad y notificar a continuación que el cambio se ha completado mediante la interfaz IEntityChangeTracker. El ObjectStateEntry administra de manera diferente las entidades POCO sin objetos proxy de seguimiento de cambios y los objetos de tipo complejo. Para obtener más información, vea Realizar el seguimiento de los cambios en entidades POCO (Entity Framework).

El contexto de objetos utiliza la información de los objetos ObjectStateEntry para conservar los datos en el origen de datos. Para obtener más información, vea Guardar los cambios y administrar la simultaneidad (Entity Framework) y Cómo: Ejecutar la lógica de negocios al guardar los cambios (Entity Framework).

Resolución de identidad y opciones de combinación

Entity Framework solo mantiene una única instancia de un objeto con una clave de entidad concreta en la memoria caché. Los objetos EntityKey son objetos inmutables que representan la identidad del objeto. Las claves de entidad se utilizan para llevar a cabo la resolución de identidad en el contexto del objeto. Para obtener más información, vea Trabajar con claves de entidad (Entity Framework). Si ya se realiza el seguimiento de una entidad con la misma identidad, los datos procedentes del origen de datos y los datos ya presentes en el administrador de estado se combinan según la opción MergeOption.

En la siguiente tabla se muestran las posibles opciones de combinación:

Miembro Descripción

AppendOnly

Los objetos que no existen en el contexto del objeto se adjuntan al contexto. Si un objeto ya está en el contexto, los valores actual y original de las propiedades del objeto de la entrada no se sobrescriben con valores del origen de datos. El estado de la entrada del objeto y estado de las propiedades del objeto en la entrada no cambia. AppendOnly es la opción de combinación predeterminada.

OverwriteChanges

Los objetos que no existen en el contexto del objeto se adjuntan al contexto. Si un objeto ya está en el contexto, los valores actual y original de las propiedades del objeto de la entrada se sobrescriben con valores del origen de datos. El estado de la entrada del objeto se establece en Unchanged y ninguna propiedad se marca como modificada.

PreserveChanges

Los objetos que no existen en el contexto del objeto se adjuntan al contexto.

Si el estado de la entidad es Unchanged, los valores actual y original de la entrada se sobrescriben con valores del origen de datos. El estado de la entidad sigue siendo Unchanged y ninguna propiedad se marca como modificada.

Si el estado de la entidad es Modified, los valores actuales de las propiedades modificadas no se sobrescriben con valores del origen de datos. Los valores originales de las propiedades no modificadas se sobrescriben con los valores del origen de datos.

En .NET Framework versión 4, Entity Framework compara los valores actuales de propiedades no modificadas con los valores que se devolvieron del origen de datos. Si los valores no son iguales, la propiedad se marca como modificada.

En .NET Framework versión 3.5 SP1, Entity Framework no marca la propiedad como modificada, aunque el valor en el origen de datos sea diferente.

Solo las propiedades modificadas se conservan en el origen de datos al llamar a SaveChanges.

Para conservar el comportamiento de la versión 3.5 SP1, establezca UseLegacyPreserveChangesBehavior en true. La opción PreserveChanges se puede utilizar para resolver las excepciones de simultaneidad optimista al tiempo que se conservan los cambios en el contexto local. Para obtener más información, vea Guardar los cambios y administrar la simultaneidad (Entity Framework).

NoTracking

Los objetos se mantienen en un estado Detached y no se realiza ningún seguimiento de ellos en ObjectStateManager. Sin embargo, las entidades generadas por Entity Framework y las entidades POCO con objetos proxy mantienen una referencia al contexto del objeto para facilitar la carga de los objetos relacionados.

Estado de la entidad

El contexto de objetos debe conocer el estado de un objeto para guardar los cambios en el origen de datos. Los objetos ObjectStateEntry almacenan información EntityState. Los métodos SaveChanges de ObjectContext procesan entidades adjuntas al contexto y actualizan el origen de datos según el EntityState de cada objeto. Para obtener más información, vea Crear, agregar, modificar y eliminar objetos (Entity Framework). La tabla siguiente muestra los posibles estados de un objeto:

Miembro Descripción

Added

El objeto es nuevo, se ha agregado al contexto de objetos y no se ha llamado al método SaveChanges. Una vez guardados los cambios, el estado del objeto cambia a Unchanged. Los objetos con el estado Added no poseen valores originales en ObjectStateEntry.

Deleted

El objeto se ha eliminado del contexto de objetos. Una vez guardados los cambios, el estado del objeto cambia a Detached.

Detached

El objeto existe, pero no se realiza su seguimiento. Una entidad está en este estado inmediatamente después de crearla y antes de agregarla al contexto de objetos. Una entidad también está en este estado después de quitarla del contexto mediante una llamada al método Detach o si se carga con NoTracking MergeOption. No hay ninguna instancia de ObjectStateEntry asociada con objetos en el estado Detached.

Modified

Se modificó una de las propiedades escalares en el objeto y no se llamó al método SaveChanges. En entidades POCO sin objetos proxy de seguimiento de cambios, el estado de las propiedades modificadas cambia a Modified cuando se llama al método DetectChanges. Una vez guardados los cambios, el estado del objeto cambia a Unchanged.

Unchanged

El objeto no se ha modificado desde que se adjuntó al contexto o desde la última vez que se llamó al método SaveChanges.

El ObjectStateManager administra el estado de los objetos dentro de un contexto del objeto. Para averiguar el estado de un objeto, llame a uno de los siguientes métodos ObjectStateManager: TryGetObjectStateEntry, GetObjectStateEntry o GetObjectStateEntries. La propiedad State del ObjectStateEntry define el estado del objeto.

Vea también

Conceptos

Trabajar con claves de entidad (Entity Framework)