我们正在从 db 加载数据:
var somethings = Context.SomethingSet.ToList();
然后有人在上下文之外删除或添加行。Out context 仍然缓存已删除的对象,因为它不知道它们已被删除。即使我调用 Context.SomethingSet.ToList(),我们的上下文仍然包含已删除的对象并且导航属性不正确。
从数据库刷新整个集合的最佳方法是什么?
我们正在从 db 加载数据:
var somethings = Context.SomethingSet.ToList();
然后有人在上下文之外删除或添加行。Out context 仍然缓存已删除的对象,因为它不知道它们已被删除。即使我调用 Context.SomethingSet.ToList(),我们的上下文仍然包含已删除的对象并且导航属性不正确。
从数据库刷新整个集合的最佳方法是什么?
Refresh方法是您正在寻找的:
Context.Refresh(RefreshMode.StoreWins, somethings);
EF 数据上下文是工作单元模式的实现。因此,它的设计目的不是超出正在完成的工作单元。一旦您的工作完成,您的数据上下文就会被丢弃。
这是 EF v1、EF v4 和 LINQ to SQL 的基本设计决策。除非您有非常具体的数据使用模式和大量内存,否则您应该避免将数据上下文保留的时间超过完成工作单元绝对需要的时间。
http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/
http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html
对于虚拟属性,重新加载没有帮助。它需要分离并重新加载
public T Reload<T>(T entity) where T : class, IEntityId
{
((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
}