【发布时间】:2017-11-19 10:17:31
【问题描述】:
我有一个方法可以接收要删除的某些行的 ID。我正在使用这样的代码:
public bool delete(IEnumerable<long> paramIeId)
{
using(myContext)
{
foreach(long iterator in paramIeId)
{
nyDbContext.Remove(new MyType(){ID = iterator});
}
}
}
它工作正常,因为当存在时删除行。但是如果有 1 行或更多行不存在,那么我会得到一个异常并且没有任何行被删除,尽管其中一些存在。
如果我在 T-SQL 中执行此查询,我没有问题,数据库会删除现有行并忽略不存在的行,因为最后我想删除它们,所以如果另一个进程为我删除了它们,不问题。
我可以处理刷新 dbContextfrom 数据库的乐观并发异常,但我认为这是可以避免的额外查询。
EF 有什么方法可以像 T-SQL 一样工作吗?如果我尝试删除不存在的行,请忽略它并删除其余行。
谢谢。
【问题讨论】:
-
我不确定是否可以禁用此行为。 EF 发现您的“DELETE from”语句影响的行数少于预期并抛出此异常。在这种情况下,您最好自己执行原始 sql 查询,而不使用 EF。
-
这是 EF 的非逻辑行为之一。有一个开放的增强请求 Optimistic concurrency check should be configurable #6218 涵盖了这一点,尽管如果您问我,删除的默认行为不应引发此类异常。
-
如果 paramIeId 实现 IEnumerable
那么您可以执行 foreach(long id in paramIeId.ToList()) 以防止 LINQ 执行延迟查询以在运行时删除集合项。使用 .ToList() 方法将在迭代列表时冻结列表。
标签: c# optimistic-concurrency ef-core-2.0