Asp.net 实体框架中删除对象时的并发性

Asp.net 实体框架中删除对象时的并发性,asp.net,entity-framework,entity-framework-4,concurrency,optimistic-concurrency,Asp.net,Entity Framework,Entity Framework 4,Concurrency,Optimistic Concurrency,我正在使用实体框架开发一个web应用程序。我加载一个对象列表并将其绑定到一个转发器,以显示所有项目的摘要。用户可以单击中继器中每个项目的编辑图标或删除图标 例如: 第1项|编辑|删除 项目2 |编辑|删除 使用rowversion列进行并发时,编辑工作正常,因为记录已加载,并且ID和rowversion列的值保留在隐藏的表单字段中。这些“原始”值可供以后进行更新时使用 但是,如果用户单击删除记录,我将从数据库加载对象,调用DeleteObject(),然后调用SaveChanges()。问题是

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

例如:

第1项|编辑|删除

项目2 |编辑|删除

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

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


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

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

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

与Andreas H指定的不同的方法是使用存储过程进行删除。通过这种方式,您可以在存储的进程中执行并发检查和删除,如果存在冲突,则会引发异常。

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

  • 使用隐藏的表单字段存储ID和rowversion值
  • 当用户单击delete按钮时,从数据库加载对象。此对象包含的rowversion值可能与隐藏字段中存储的值不同
  • 将隐藏字段中的rowversion值指定给相应的属性 在物体上
  • 为此对象调用对象状态管理器的AcceptChanges()方法。这将导致我存储的rowversion值被接受为“当前”值
  • 删除对象并在对象上下文上调用SaveChanges()

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

    我不理解您的问题。为什么要在删除记录时进行并发检查?例如,假设您正在浏览记录,希望删除那些尚未标记为已支付的记录。打开列表后,另一个用户进入并将记录标记为已付款。根据您看到的信息(现在已过时),您决定删除该记录。您单击“删除”按钮,现在已付款记录已被删除,因为它在屏幕上显示为“未付款”。在这种情况下,并发检查可以防止这种情况发生。