Asociar y desasociar objetos (Entity Framework)
En Entity Framework , los objetos se pueden asociar o desasociar de un contexto. Los objetos asociados a un contexto reciben un seguimiento y son administrados por ese contexto. El contexto del objeto no hace referencia a los objetos desasociados, y .NET Framework puede reclamar sus recursos. En este tema se describe cómo asociar y desasociar objetos y algunas consideraciones para hacerlo.
Asociar objetos
Cuando una consulta se ejecuta dentro de un contexto de objetos en Entity Framework , los objetos devueltos se asocian automáticamente al contexto. También puede asociar a un contexto del objeto los objetos que se obtengan de un origen que no sea una consulta. Puede asociar los objetos que se han desasociado previamente, los objetos devueltos por una consulta NoTracking o los objetos obtenidos fuera del contexto del objeto. Igualmente, puede asociar los objetos que han sido almacenados en el estado de vista de una aplicación ASP.NET o que se han devuelto en una llamada a un método remoto o en un servicio Web.
Utilice uno de los métodos siguientes para asociar el objeto a un contexto del objeto:
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 |
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. |
Los objetos se asocian al contexto del objeto en un estado Unchanged. Si necesita cambiar el estado de un objeto o la relación porque sabe que su objeto se modificó en el estado desasociado, utilice uno de los siguientes métodos.
Miembro | Descripción |
---|---|
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. |
|
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 ChangeObjectState de ObjectStateEntry. |
|
ChangeState |
Este método se comporta igual que ChangeObjectState u ChangeRelationshipState, dependiendo de si ObjectStateEntry es un objeto o una relación. |
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. |
Si el objeto que se va a asociar ha actualizado los valores de propiedad, utilice uno de 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. |
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. |
|
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. |
Consideraciones para asociar objetos
Las consideraciones siguientes son válidas al asociar objetos al contexto del objeto:
Si el objeto que se asocia tiene objetos relacionados, esos objetos también se asocian al contexto del objeto.
Si el objeto asociado no existe en el origen de datos, no se agrega durante SaveChanges. En este caso, cuando se realizan cambios en las propiedades, se produce una excepción en el servidor durante SaveChanges. Para agregar un objeto, use System.Data.Objects.ObjectSet.AddObject( o System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)
Si el objeto que se asocia está relacionado con otros objetos, debe definir explícitamente las relaciones de alguna de las maneras que se describen en Definir y administrar relaciones (Entity Framework). Para obtener más información, vea Cómo asociar objetos relacionados (Entity Framework).
El objeto que se pasa al método Attach debe tener un valor de EntityKey válido. Si el objeto no tiene un valor de EntityKey válido, use el método AttachTo para especificar el nombre del conjunto de entidades.
Se produce una excepción InvalidOperationException cuando el objeto que se va a asociar tiene la misma EntityKey que un objeto diferente ya presente en el contexto del objeto. Este error no se produce si hay un objeto en el contexto con la misma clave pero en el estado Added.
Desasociar objetos
En aplicaciones de Entity Framework , puede desasociar objetos del contexto. Podría desasociar objetos para ahorrar recursos, ya que la ejecución de consultas repetidas en el mismo contexto del objeto aumenta los requisitos de memoria del contexto. Puede hacer que los objetos no se asocien al contexto ejecutando una consulta con un valor MergeOption de NoTracking, o bien, puede desasociarlos llamando al método System.Data.Objects.ObjectContext.Detach(System.Object) o System.Data.Objects.ObjectSet.Detach( y pasando una referencia al objeto que se quiere desasociar, como en el siguiente ejemplo:
' Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());
Consideraciones para desasociar objetos
Al desasociar objetos deben tenerse en cuenta las consideraciones siguientes:
Detach solo afecta al objeto específico que se pasa al método. Si el objeto que se desasocia tiene objetos relacionados en el contexto del objeto, esos objetos no se desasocian.
En una asociación independiente, la información de la relación no se mantiene para un objeto desasociado.
La información del estado de los objetos no se mantiene cuando un objeto se desasocia. Esto incluye los cambios sometidos a seguimiento y los valores de las claves temporales.
La desasociación de objetos no afecta a los datos del origen de datos.
Durante una operación de desasociar, no se aplican las restricciones referenciales ni las directivas de eliminación en cascada en una relación de identificación.
Las ventajas de desasociar objetos se deberían considerar teniendo en cuenta el procesamiento adicional que precisa la operación. Cuando el ámbito de los datos de usuario haya cambiado, por ejemplo al mostrar un formulario nuevo con un conjunto de datos diferente, debería considerar crear una nueva instancia de ObjectContext, en lugar de simplemente desasociar los objetos de un ObjectContext existente.
Para obtener más información, vea Cómo: Desasociar objetos de un contexto del objeto (Entity Framework).
En esta sección
Cómo asociar objetos relacionados (Entity Framework)
Cómo aplicar los cambios realizados a un objeto desasociado (Entity Framework)
Cómo: Desasociar objetos de un contexto del objeto (Entity Framework)