entity-framework - existing - entity framework model first
Forzar primero el código EF 4.1 para ver una entidad adjunta como modificada (3)
Todos los ejemplos que he encontrado se refieren a una clase llamada ObjectContext, que no parece existir en CTP5. Debo enfatizar en este punto, CTP5 es mi primera exposición al Entity Framework.
Tengo un POCO desconectado que he adjuntado a mi DbContext. SaveChanges no recoge el cambio, sin embargo, ¿cómo le digo a mi contexto que actualice esa entidad?
_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
¿Qué estoy haciendo mal?
Actualización 12/01/2011 Puede ser obvio para la mayoría, pero como usuario de EF por primera vez, no se me ocurrió que adjuntar un objeto que ya estaba conectado borraría el estado anterior. Esto me causó mucho dolor. Pero quería usar el patrón de Repository de una manera muy genérica, una forma que no importaba si el objeto ya estaba adjunto o se había creado recientemente como resultado del enlace MVC de ASP.NET. Así que necesitaba un método UpdateUser
, y lo adjunto a continuación.
public User UpdateUser(User user) {
if (_context.Entry(user).State == EntityState.Detached) {
_context.Users.Attach(user);
_context.Entry(user).State = EntityState.Modified;
}
return user;
}
El método obviamente asume que el objeto existe en el almacén de datos de alguna manera, después de todo se llama UpdateUser
. Si el objeto ya está conectado, se beneficiará del estado anterior del objeto, que a su vez permitirá una actualización optimizada de la base de datos. Sin embargo, si el objeto no estaba conectado, el método obliga a que todo se ensucie.
Parece obvio ahora, no fue antes. Espero que ayude a alguien.
Rico
Creo que no es necesario adjuntar la entidad antes de que se modifique la llamada. simplemente configurando a modificado hará el trabajo.
if (_context.Entry(user).State == EntityState.Detached)
{
_context.Entry(user).State = EntityState.Modified;
}
Cuando adjunta una entidad, pasa al estado Sin cambios (no se ha modificado desde que se adjuntó al contexto). Todo lo que necesita es cambiar explícitamente el Estado de la entidad a Modificado :
_context.Users.Attach(user);
_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
_context.SaveChanges();
En aras de la integridad, puede acceder al ObjectContext al convertir el DbContext a IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
El método de Morteza es mucho más limpio y obtiene mi voto.