我有这个使用Entity Framework 4.1访问数据库实体的代码:
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;
}
当我在asp.net mvc中运行它时会返回:
News [Edited]
我期待它回归:
News
因为我认为我的foreach
只会修改lNav
的内容。相反,它似乎修改了实体对象的所有实例。
如何修改lNav
而不修改nav
?
答案 0 :(得分:1)
尝试AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
这种方式加载的实体没有附加到上下文,应该为第一个实体创建两个不同的实例。通过使用AsNoTracking
,您可以禁用实体的键值与对象引用之间的标识映射,这些映射负责您观察到的行为。 (在上下文中始终只有一个具有给定键的实体引用,如果加载具有相同键的实体,EF不会创建新对象。而是返回上下文中已存在的对象。)
请注意,如果您打算在EFs更改跟踪机制的帮助下更新实体,则无法使用此功能。 AsNoTracking()
专为只读方案而设计。