D3v*_*3vy 8 c# entity-framework change-tracking entity-framework-6
我很难理解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();
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,正如我们可以从ProcessUsers方法中的代码中看到的那样,我们有一个用户列表,我们正在修改该列表.
现在我知道这是有效的,它是我一直这样做的方式,但我总是认为列表中的对象(在这种情况下是用户)是对DBSet Local集合中相应对象的引用.
经过一番思考之后,我不确定是否会出现这种情况,好像上下文已被处理,列表仍然被填充并且可以被操作(我们只是松开了将其推回数据库的能力而没有一些额外的工作)所以从那里透视列表中的项目必须是DBSet Local集合中的项目的副本...但是如果是这种情况我不会操作列表中的对象会对dbset中的对象产生任何影响这将是一个副本.
综上所述
问题是当我在DBSet上调用ToList时会发生什么,以及在此实例中更改跟踪如何工作? - 我知道它确实有效,但我认为我目前的理解可能不正确.
您需要使用context.TableName.Update(obejct)来标记更新的对象。context.Savechanges();接下来在您的示例中使用 So保存更改
public void ProcessUsers()
{
_users = _dal.GetUsers();
foreach(var u in users)
{
u.user.Comment = "This is a test";
_dal.Users.Update(u);
}
_dal.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |