2011-04-07 11 views

Respuesta

14

Cada entidad cargada desde la base de datos mantiene dos conjuntos de valores: original (los cargados desde DB) y actual (los que está modificando). Estos dos conjuntos se mantienen en ObjectStateEntry. Por lo general, cada guardado es seguido por la aceptación de cambios que toma los valores actuales y los escribe en los valores originales. Si sabe que realizó cambios en la entidad fuera de EF (por ejemplo, llamando al procedimiento almacenado con EF de ADO.NET común), puede forzar a EF a conocer esos cambios sin volver a cargar la entidad utilizando ApplyOriginalValues. Creo que usar este método es bastante raro. Por ejemplo, utilicé ApplyOriginalValues en this answer.

+0

¡Excelente! Gracias. –

1

Recientemente utilicé el método ApplyOriginalValues ​​() para usar en un escenario de eliminación suave o eliminación lógica.

Estamos utilizando Entity Framework 4.1 y hemos implementado eliminaciones lógicas/suaves cuando el contexto guarda cambios.

El código siguiente comprueba si la entidad se elimina, luego verifica si implementa la interfaz adecuada. Si es así, cambiamos el estado de la entidad de eliminado a modificado y aplicamos los valores originales (entry.ApplyOriginalValues ​​()), y establecemos el flag borrado.

if (entry.State == EntityState.Deleted) 
       { 
        if (entry.Entity is IEnforceLogicalDelete) 
        { 
         IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete; 
         ObjectStateManager.ChangeObjectState(entry.Entity, EntityState.Modified); 
         entry.ApplyOriginalValues(entry.Entity); 
         delete.IsDeleted = true; 
        } 
       } 

Originalmente tuvimos un problema en el que las Propiedades de navegación se establecían en NULO o estaban vacías cuando se eliminaba lógicamente. El método ObjectContext.DeleteObject() marcaba todas las propiedades de navegación para su eliminación antes de que se desencadenara el evento Context.SavingChanges(). Al cambiar el estado de eliminado a modificado, las propiedades de la clave externa aún se borraron. Estaba tratando de encontrar un gancho para el método RevertDelete() (ILSpy es muy útil), pero ApplyOriginalValues ​​() funcionó.

Cuestiones relacionadas