【问题标题】:DBConcurrency exception using Entity Framework 6使用实体框架 6 的 DBConcurrency 异常
【发布时间】:2013-11-20 21:21:32
【问题描述】:

我在执行本应足够简单的任务时遇到错误。

我首先使用的是 Entity Framework 6 代码。

我正在向我的上下文中添加一个新实体,将其删除,然后执行保存。这会产生一个 DBConcurrency 异常(我是唯一的用户)。

为此,我执行以下操作:

zurich.TagProjectGroupItems.Add(tagProjectGroupItem); zurich.TagProjectGroupItems.RemoveRange(items);

(最初添加的对象是集合的一部分)

int counter = zurich.SaveChanges();

这会产生以下异常:

EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常,但未在用户代码中处理 附加信息:存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

objectcontext 告诉我有 0 个新条目,0 个已更新,1 个要删除。我想它正试图从数据库中删除实体并返回 0 结果,因为该实体尚未被写入。

我做错了什么?!我以前从未使用过代码,并且只在 EF4 中使用过模型。我被难住了。

非常感谢,

罗伯

【问题讨论】:

  • 您是说要从集合中删除的项目对象包含您刚刚添加到上下文中的“tagProjectGroupItem”吗?
  • 正确的是 Ciaran。用户界面允许用户添加实体并删除/删除它。我可以删除,但显然我得到了相同的结果。
  • 但是,如果您要在之后立即删除该项目,为什么还要将该项目添加到上下文中呢?实体的添加和删除不是单独的事件/处理程序吗?
  • 用户有一个用户界面,允许他/她在网格中添加、删除和更新条目。当窗口关闭时,将执行保存。因此,用户可能会或可能不会实际执行此操作(添加然后删除),即他们可能会添加一个项目并改变主意并将其删除。每次添加项目时,我都不想进入数据库,因为它看起来非常适合数据库聊天。我以前可以用 EF 4 做到这一点,但现在不行?

标签: c# entity-framework


【解决方案1】:

DbUpdateConcurrencyException 被称为“当预期实体的 SaveChanges 会导致数据库更新但实际上数据库中的行没有受到影响时”。 Source

我认为 EntityFramework 执行此检查是为了防止多用户场景中的并发问题。

您可以在添加项目之后再插入另一个 zurich.SaveChanges();,然后它应该会成功删除这些项目,但正如您所提到的,这并不理想。

也许您应该检查项目的集合 - 如果 tagProjectGroupItem 包含在项目中,则不要调用 zurich.TagProjectGroupItems.Add(tagProjectGroupItem);,而是从集合中删除 tagProjectGroupItem 在调用之前数据库操作。

【讨论】:

  • 我已经设法通过在从上下文中删除实体状态时检查它来绕过它。在 remove 方法中,如果它是 entitystate.add ,那么我将其设置为分离。因此,当开始保存时,实体会分离并且不会导致问题。这似乎解决了问题,但似乎有点hacky。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多