¿Cómo actualizo los objetos de Entity Framework sin cambiar todas las instancias de ese objeto?
-
26-10-2019 - |
Pregunta
Tengo este código que utiliza Entity Framework 4.1 para acceder a entidades de base de datos:
public string Test()
{
Navigation nav = db.Navigations.FirstOrDefault();
List<Navigation> lNav = db.Navigations.ToList();
foreach (var item in lNav)
{
item.Label += " [Edited]";
}
return nav.Label;
}
Cuando ejecuto esto en ASP.NET MVC, devuelve esto:
News [Edited]
Esperaba que volviera:
News
Porque pensé mi foreach
solo modificaría el contenido de lNav
. En cambio, parece modificar todas las instancias de los objetos de la entidad.
¿Cómo puedo modificar? lNav
sin modificar también nav
?
Solución
Probar AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
De esta manera, las entidades cargadas no están unidas al contexto y se deben crear dos instancias diferentes para la primera entidad. Mediante el uso AsNoTracking
Desactiva el mapeo de identidad entre los valores clave de una entidad y referencias de objetos que es responsable del comportamiento que observó. (Siempre solo puede haber una referencia de entidad con una clave dada en el contexto y EF no crea un nuevo objeto si carga una entidad con la misma clave. En su lugar, devuelve el objeto que ya existe en el contexto).
Tenga en cuenta que no puede usar esto si tiene la intención de actualizar entidades con la ayuda del mecanismo de seguimiento de cambios EFS. AsNoTracking()
está diseñado para escenarios de lectura.