以下代码演示了我对Entity Framework的问题。假设'bob'在会话表中有很多记录。
我希望sessionCountB比sessionCountA小1:
using (var context = new MyEFContext)
{
int sessionCountA = (from a in context.sessions
where a.user = 'bob' select a).Count();
sessions firstSession = (from a in context.sessions
where a.user = 'bob').FirstOrDefault();
context.sessions.DeleteObject(firstSession);
int sessionCountB = (from a in context.sessions
where a.user = 'bob' select a).Count();
// I expect sessionCountB == sessionCountA - 1
}
我知道DeleteObject只标记要删除的对象 - SaveChanges会删除数据库。
但是,在调用SaveChanges之前,是否应该将删除的对象排除在同一数据模型上执行的进一步查询之外?
答案 0 :(得分:2)
解决方案
_context.sessions.Where(a => _context.Entry(a).State != EntityState.Deleted);
var x = _context.Accounts
)后,y = x.Local
将过滤具有已删除状态的实体。
注意 - 没有Local
你也不会在从db加载的集合中看到新添加的实体。
great example and explanation 答案 1 :(得分:1)
当你创建一个查询时,我希望Entity Framework能够缓存数据库中的结果,以及当你在同一个上下文中重新运行完全查询时的那些确切结果,因为这是数据库在查询时反映的内容。 / p>
想想如果你添加了一个实体会发生什么,你会对主键做些什么?或者当您将更改提交到数据库并且您有一些外键约束阻止删除成功时会发生什么?我想说这是一种预期的行为。
作为一种解决方法,您可以从数据库中获取所有项目并将结果存储在C#中的集合中,然后从服务器端集合执行删除操作,获取该集合的计数并稍后将删除提交到数据库。