3

我正在使用实体框架开发一个 Web 应用程序。我加载一个对象列表并将其绑定到转发器以显示所有项目的摘要。用户可以点击转发器中每个项目的编辑图标或删除图标。

例子:

项目 1 | 编辑 | 删除

项目 2 | 编辑 | 删除

...

使用 rowversion 列进行并发时编辑工作正常,因为记录已加载并且 ID 和 rowversion 列的值保留在隐藏的表单字段中。这些“原始”值随后可在更新时使用。

但是,如果用户单击删除记录,我从数据库中加载对象,调用 DeleteObject(),然后调用 SaveChanges()。这样做的问题是,当我加载记录时,它会获取最新的 rowversion 值,因此任何并发检查都变得无用。

如何确保在删除记录时进行并发检查?

4

3 回答 3

5

实际上,如果要删除它,则不必从数据库中加载对象。

相反,创建一个ObjectContext,通过 Attach() 将您的 ObjectToDelete 附加到该上下文,然后通过 DeleteObject() 和 SaveChanges()。因此,您将能够收到有关并发的异常。

于 2011-07-14T19:45:45.323 回答
1

在阅读了这个问题的答案后,我决定使用以下方法。

  1. 使用隐藏的表单字段来存储 ID 和 rowversion 值。
  2. 当用户单击删除按钮时,从数据库中加载对象。此对象包含可能与隐藏字段中存储的值不同的 rowversion 值。
  3. 将隐藏字段中的 rowversion 值分配给对象的适当属性。
  4. 为此对象调用对象状态管理器的 AcceptChanges() 方法。这会导致我存储的 rowversion 值被接受为“当前”值。
  5. 删除对象并在对象上下文中调用 SaveChanges()。

因此,我存储的原始 rowversion 值在尝试删除记录时传递给 SQL,并与行中的当前值进行比较。如果它们不匹配,则会引发 OptimisticConcurrencyException。

于 2011-09-07T19:12:09.617 回答
0

与 Andreas H 指定的不同方法是使用存储过程进行删除。这样您就可以在存储过程中进行并发检查和删除,如果存在违规则引发异常。

于 2011-07-14T20:19:21.340 回答