如何在不更改该对象的所有实例的情况下更新实体框架对象?
-
26-10-2019 - |
题
我有此代码使用实体框架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
?
解决方案
尝试 AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
这样,加载实体就不会附加到上下文,应为第一个实体创建两个不同的实例。通过使用 AsNoTracking
您可以禁用实体的键值和对象引用的键值,这是您观察到的行为的原因。 (总是只能有一个实体参考,在上下文中具有给定键的一个实体参考,如果将实体加载具有相同的密钥,则EF不会创建新对象。相反,它返回上下文中已经存在的对象。)
请注意,如果您打算在EFS更改跟踪机制的帮助下更新实体,则不能使用它。 AsNoTracking()
专为可读场景而设计。
不隶属于 StackOverflow