【问题标题】:Entity Framework delete without select and Optimistic Concurrency没有选择和乐观并发的实体框架删除
【发布时间】:2017-03-20 16:50:05
【问题描述】:

我正在尝试使用实体框架删除记录(如果它存在) - 我想生成类似的东西

delete from tbl where id = 1

我不在乎是否存在任何记录,如果存在我只想删除它们。我应该可以不先像这样选择它们:

var record = new tbl { id = 1, rel = new tbl_related { tbl_id = 1 } };
context.tbl.Attach(tbl);
context.tbl.Remove(tbl);
context.SaveChanges();

语法可能不完全存在,因为这不是复制和粘贴,我添加了外键关系以表明我正在考虑这一点。

在运行此代码时,EF 会生成正确的 SQL 并运行,但我得到一个 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException 说“存储更新、插入或删除语句影响了意外的行数 (0)。实体自加载实体后可能已被修改或删除”。

但是,我完全希望很多时候会删除零行。关于如何解决这个问题的任何想法?

我被指出How to ignore a DbUpdateConcurrencyException when deleting an entity 可能是重复的。这建议处理我现在正在做(并忽略)的 DbUpdateConcurrencyException,但该帖子谈到尝试删除可能已被删除的行 - 我想删除可能永远不存在的行。我知道这可能只是一个语义问题,因为分辨率是相同的,但我想强调我正在做一些我认为完全合理的事情,而框架并没有很好地处理它。

谢谢

【问题讨论】:

标签: entity-framework


【解决方案1】:

extension for EF on github 允许您通过一次调用数据库来更新和删除实体。

使用此扩展程序,您可以执行以下操作:

context.tbl.Delete(t => t.Id == 1);

一次调用即可消除您的 DbUpdateConcurrencyException。

【讨论】:

  • 我们也在项目中使用它!像魅力一样工作。
  • 不支持context.SaveChanges()
  • @Toolkit 如果您想将删除与其他更改一起应用,您可以将所有内容包装在事务中。
猜你喜欢
  • 2011-02-23
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多