我正在使用实体框架开发一个Web应用程序。我加载一个对象列表并将其绑定到转发器以显示所有项目的摘要。用户可以单击转发器中的每个项目的编辑图标或删除图标。
示例:
第1项|编辑|删除
第2项|编辑|删除
...
使用rowversion列进行并发时,编辑工作正常,因为加载了记录,ID和rowversion列的值保存在隐藏的表单字段中。这些“原始”值随后可用于更新。
但是,如果用户单击Delete作为记录,我从数据库加载对象,调用DeleteObject(),然后调用SaveChanges()。这个问题是当我加载记录时,它获取最新的rowversion值,因此任何并发检查都是无用的。
如何确保在删除记录时进行并发检查?
答案 0 :(得分:5)
实际上,如果要删除对象,则不必从数据库加载对象。
相反,创建一个ObjectContext
,通过Attach(),然后DeleteObject()和SaveChanges()将ObjectToDelete附加到该上下文。
因此,您将能够收到有关并发的异常。
答案 1 :(得分:0)
与Andreas H指定的方法不同的方法是使用存储过程进行删除。这样你就可以在存储过程中进行并发检查和删除,如果存在违规则引发异常。
答案 2 :(得分:0)
在阅读this question的答案后,我决定使用以下方法。
因此,我尝试删除记录时将存储的原始rowversion值传递给SQL,并将其与行中的当前值进行比较。如果它们不匹配,则引发OptimisticConcurrencyException。