Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EntityFramework:如何从查询中排除已删除的对象_Entity Framework - Fatal编程技术网

Entity framework EntityFramework:如何从查询中排除已删除的对象

Entity framework EntityFramework:如何从查询中排除已删除的对象,entity-framework,Entity Framework,下面的代码演示了我在实体框架中遇到的问题。假设“bob”在sessions表中有许多记录 我预计sessionCountB比sessionCountA少1个: using (var context = new MyEFContext) { int sessionCountA = (from a in context.sessions where a.user = 'bob' select a).Count(); sessions f

下面的代码演示了我在实体框架中遇到的问题。假设“bob”在sessions表中有许多记录

我预计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之前,我对同一数据模型执行的进一步查询中没有排除已删除的对象?

创建查询时,我希望Entity Framework缓存数据库中的结果,当您在相同的上下文上重新运行精确的查询时,这些精确的结果,因为这是数据库在查询时反映的结果

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

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

解决方案

  • 如果您不想看到处于删除状态的实体,只需显式筛选它们
  • \u context.sessions.Where(a=>\u context.Entry(a.State)!=EntityState.Deleted)

  • 从db加载集合(
    var x=\u context.Accounts
    )后获取“本地”集合,
    y=x.Local
    将过滤具有已删除状态的实体。 注意-如果没有
    Local
    u,您也不会在从db加载的集合中看到新添加的实体。

  • 我可以在调试器中看到,“firstSession”对象的EntityState属性设置为“Deleted”。不幸的是,我不能在LINQ语句中使用EntityState-编译器不允许这样做。