gpt4 book ai didi

c# - 调用 ToList() 后的 Entity Framework 更改跟踪

转载 作者:太空狗 更新时间:2023-10-29 19:46:31 26 4
gpt4 key购买 nike

我很难理解 EF6 中的更改跟踪。

我有类似的代码。

public class SomeClass
{
private List<User> _users;
private DAL _dal;

public void ProcessUsers()
{
_users = _dal.GetUsers();

foreach(var u in users)
{
u.user.Comment = "This is a test";
}

_dal.SaveChanges();
}
}

DAL 类看起来有点像这样。

public class DAL
{
...
private DataContext _context; // Assume that this is being newed up in a constructor.

public List GetUsers()
{
return _context.Users.ToList();
}

public void SaveChanges()
{
_context.SaveChanges();
}
}

因此,从 ProcessUsers 方法中的代码可以看出,我们有一个用户列表,我们正在修改该列表。

现在我知道这是行得通的,这是我一直这样做的方式,但是我一直认为列表中的对象(在本例中为用户)是对 DBSet Local 集合中相应对象的引用.

经过一番思考后,我不确定是否是这种情况,就好像上下文已被释放一样,列表仍然存在并且可以被操作(我们只是失去了将它推回数据库的能力而无需一些额外的工作)所以从这个角度来看,列表中的项目必须是 DBSet Local 集合中项目的副本......但如果是这样的话,我不会认为操作列表中的对象会对列表中的对象产生任何影响dbset,因为它将是一个副本。

总结

问题是当我在 DBSet 上调用 ToList 时会发生什么,更改跟踪在这种情况下如何工作? - 我知道它确实有效,但我认为我目前的理解可能不正确。

最佳答案

EF 有一个集合,其中跟踪所有未决的更改(_context.ObjectStateManagersee here...)。使用 EF 加载更多实体时,您会得到一个代理实例,而不是真正的实体类。使用此代理 EF 会将代码“注入(inject)”到您的实体实例中,以更新更改跟踪信息。

当您处理上下文时,您会丢失此信息。要将现有实体实例添加到另一个上下文,您可以使用 _context.Attach() 方法。

SaveChanges() 确实处理了 _context.ObjectStateManager 信息。

关于c# - 调用 ToList() 后的 Entity Framework 更改跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590022/

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