5

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

4

2 回答 2

2

解决方案

  1. 如果您不想看到处于已删除状态的实体,只需明确过滤它们

_context.sessions.Where(a => _context.Entry(a).State != EntityState.Deleted);

  1. var x = _context.Accounts从 db 加载集合 () 后获取“本地”集合,y = x.Local将过滤具有已删除状态的实体。注意 - 没有Local你也不会在你从 db 加载的集合中看到新添加的实体。 很好的例子和解释
于 2017-01-20T13:18:45.353 回答
1

当您创建查询时,我希望 Entity Framework 缓存来自数据库的结果,以及当您在同一上下文中重新运行确切查询时的那些确切结果,因为这就是查询时数据库所反映的内容。

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

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

于 2013-09-04T12:58:43.313 回答