Comment puis-je mettre à jour Entity Framework objets sans changer toutes les instances de cet objet?
-
26-10-2019 - |
Question
J'ai ce code qui utilise Entity Framework 4.1 à des entités de base de données d'accès:
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;
}
Quand je lance ceci dans asp.net mvc il retourne ceci:
News [Edited]
Je m'y attendais à revenir:
News
Parce que je pensais que mon foreach
ne ferait que modifier le contenu de lNav
. Il semble plutôt de modifier toutes les instances des objets d'entité.
Comment puis-je modifier lNav
sans modifier aussi nav
?
La solution
Essayez AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
De cette façon, les entités chargées ne sont pas attachés au contexte et deux instances différentes devrait être créé pour la première entité. En utilisant AsNoTracking
vous désactivez le mappage d'identité entre les valeurs clés d'une entité et des références d'objet qui est responsable du comportement que vous avez observé. (Il peut toujours seulement une référence d'entité avec une clé donnée dans le contexte et EF ne crée pas un nouvel objet si vous chargez une entité avec la même clé. Au contraire, elle renvoie l'objet qui existe déjà dans le contexte.)
Sachez que vous ne pouvez pas utiliser si vous avez l'intention de mettre à jour les entités à l'aide du mécanisme de suivi EFs changent. AsNoTracking()
est conçu pour des scénarios en lecture seule.