Entity framework EntityFramework:如何从查询中排除已删除的对象
下面的代码演示了我在实体框架中遇到的问题。假设“bob”在sessions表中有许多记录 我预计sessionCountB比sessionCountA少1个: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
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-编译器不允许这样做。