实体框架:如何从查询中排除已删除的对象

时间:2013-09-04 12:51:46

标签: entity-framework

以下代码演示了我对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之前,是否应该将删除的对象排除在同一数据模型上执行的进一步查询之外?

2 个答案:

答案 0 :(得分:2)

解决方案

  1. 如果您不想看到处于已删除状态的实体,只需明确过滤它们
  2. _context.sessions.Where(a => _context.Entry(a).State != EntityState.Deleted);

      从数据库加载集合(var x = _context.Accounts)后,
    1. 获取“本地”集合, y = x.Local将过滤具有已删除状态的实体。 注意 - 没有Local你也不会在从db加载的集合中看到新添加的实体。 great example and explanation

答案 1 :(得分:1)

当你创建一个查询时,我希望Entity Framework能够缓存数据库中的结果,以及当你在同一个上下文中重新运行完全查询时的那些确切结果,因为这是数据库在查询时反映的内容。 / p>

想想如果你添加了一个实体会发生什么,你会对主键做些什么?或者当您将更改提交到数据库并且您有一些外键约束阻止删除成功时会发生什么?我想说这是一种预期的行为。

作为一种解决方法,您可以从数据库中获取所有项目并将结果存储在C#中的集合中,然后从服务器端集合执行删除操作,获取该集合的计数并稍后将删除提交到数据库。