它是这样的:
MyDbContext ctx = new MyDbContext();
IFooRepository repo = new FooRepository(ctx);
var items = repo.GetAvailableItem().ToList(); //this will query all item.sold = false.
// here it returns three rows
foreach(var item in items) {
item.sold = true;
}
repo.commit(); // this will call the SaveChanges() in DbContext
Thread.sleep(10000)
// Now I quickly execute a query in SQL Server Management Studio
// UPDATE Item SET Sold = 0;
var items02 = repo.GetAvailableItem().ToList(); // this will query all item.sold = false.
// here items02 also contains three rows
// HOWEVER, when I watch the value of item.sold in items02, it is all True
这是设计行为吗?
为什么呢?是因为DbContext缓存实体并且永远不会刷新,即使您再次运行相同的查询?
更新
以下是我的仓库中的代码:
public IQueryable<Item> GetAvailableItem()
{
var items = from x in DbContext.Item
where x.Sold == 0
select x;
return items;
}
public virtual int Commit()
{
return DbContext.SaveChanges();
}
答案 0 :(得分:4)
行。这就是发生的事情:
GetAvailableItem()
如果您希望上下文了解自身之外的更改,最简单的方法是再次创建新上下文和查询。另一种方法是通过yourContext.Entry<YourEntityType>(entityInstance).Reload();
告诉上下文显式从db重新加载实体。
答案 1 :(得分:1)
我的猜测是,您的DbContext
与数据库中发生的更改不一致(您说您在Thread.sleep
期间正在运行更新)。 DbContext
将不会获取这些更新(数据已缓存)。
这就是为什么你希望尽可能缩短上下文的生命周期以减少并发性。这是预期的行为。
请参阅此MSDN post