gpt4 book ai didi

entity-framework - 删除实体时如何忽略 DbUpdateConcurrencyException

转载 作者:行者123 更新时间:2023-12-03 12:04:23 43 4
gpt4 key购买 nike

我有一个应用程序可以将大量数据读入内存并分批处理。

我想要的是 Entity Framework 忽略 DbUpdateConcurrencyException删除已删除的实体时。

原因是当一个实体被处理并标记为删除时,它可能已经从数据库中删除了。

不经意地删除已经被删除的行不是问题,也不应该导致错误,我只需要一种方法来告诉 Entity Framework :)

例子

Db.Entry(itemToRemove).State = EntityState.Deleted;
Db.SaveChanges();

如果 itemToRemove 会导致错误已被删除。

注: Db.Configuration.ValidateOnSaveEnabled = false;没有像另一个线程建议的那样解决这个问题。

最佳答案

我很久以前就发布了这个问题,但它最近引起了一些关注,所以我想添加我实际使用的解决方案。

//retry up to 5 times
for (var retries = 0; retries < 5; retries++)
{
try
{
Db.SaveChanges();
break;
}
catch (DbUpdateConcurrencyException ex)
{
foreach (var entity in ex.Entries)
{
entity.State = EntityState.Detached;
}
}
}
我考虑的事情 - 我不想使用 ReloadAsync()ObjectContext.Refresh因为我想忽略在另一个进程中删除的项目,而不需要任何额外的数据库开销。
我在 for 循环中添加了作为对无限循环的简单保护 - 这不是应该能够发生的事情,但我是一个皮带和大括号接近的人,而不是 while(true) 的粉丝如果可以避免的话。
不需要像 isDone 这样的局部变量或 saveFailed - 如果我们成功保存,只需打破。
无需投 ex.Entries到一个列表中以枚举它——仅仅因为你可以在一行上写一些东西并不能让它变得更好。

关于entity-framework - 删除实体时如何忽略 DbUpdateConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295232/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com