在Entity Framework中删除对象时的并发性

时间:2011-07-14 17:30:32

标签: asp.net entity-framework entity-framework-4 concurrency optimistic-concurrency

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

示例:

第1项|编辑|删除

第2项|编辑|删除

...

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在阅读this question的答案后,我决定使用以下方法。

  1. 使用隐藏的表单字段存储ID和rowversion值。
  2. 当用户单击删除按钮时,从数据库加载对象。此对象包含的rowversion值可能与隐藏字段中存储的值不同。
  3. 将隐藏字段中的rowversion值分配给相应的属性 在对象上。
  4. 为此对象调用对象状态管理器的AcceptChanges()方法。这会导致我存储的rowversion值被接受为“当前”值。
  5. 删除对象并在对象上下文中调用SaveChanges()。
  6. 因此,我尝试删除记录时将存储的原始rowversion值传递给SQL,并将其与行中的当前值进行比较。如果它们不匹配,则引发OptimisticConcurrencyException。