我有此代码使用实体框架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() 专为可读场景而设计。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top