gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:13 24 4
gpt4 key购买 nike

我有这段使用 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 的内容。相反,它似乎修改了实体对象的所有实例。

如何在不修改 nav 的情况下修改 lNav

最佳答案

试试 AsNoTracking():

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

这样加载的实体不会附加到上下文,并且应该为第一个实体创建两个不同的实例。通过使用 AsNoTracking,您可以禁用实体的键值与对象引用之间的身份映射,而这正是您观察到的行为的原因。 (在上下文中始终只能有一个具有给定键的实体引用,如果您加载具有相同键的实体,EF 不会创建新对象。而是返回上下文中已存在的对象。)

请注意,如果您打算借助 EF 更改跟踪机制来更新实体,则不能使用它。 AsNoTracking() 专为只读场景设计。

关于c# - 如何在不更改该对象的所有实例的情况下更新 Entity Framework 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7810989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com