如何在不更改该对象的所有实例的情况下更新Entity Framework对象?

时间:2011-10-18 17:02:40

标签: c# entity-framework entity-framework-4.1

我有这个使用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

1 个答案:

答案 0 :(得分:1)

尝试AsNoTracking()

Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();

这种方式加载的实体没有附加到上下文,应该为第一个实体创建两个不同的实例。通过使用AsNoTracking,您可以禁用实体的键值与对象引用之间的标识映射,这些映射负责您观察到的行为。 (在上下文中始终只有一个具有给定键的实体引用,如果加载具有相同键的实体,EF不会创建新对象。而是返回上下文中已存在的对象。)

请注意,如果您打算在EFs更改跟踪机制的帮助下更新实体,则无法使用此功能。 AsNoTracking()专为只读方案而设计。