0

我正在尝试在 asp.net MVC 应用程序中实现乐观锁定,并提供审计跟踪。

审计框架依赖于能够在 SubmitChanges 期间调用 DataContext.GetModifiedMembers,我猜这很有意义。

乐观锁定使用 ROWVERSION 时间戳,序列化为 base64 并放入视图中的隐藏字段。

我的编辑操作如下所示:

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(MyType myType)
{ 
   context.MyTypes.Attach(myType, true);
   context.SubmitChanges(ConflictMode.FailOnFirstConflict);
}

执行此操作时,DataContext.GetModifiedMembers 将始终返回 MyType 上的所有属性,而不仅仅是在数据库和提供的值之间更改的属性,这会破坏审计。具体来说,它将每个属性都从它们的新值更改为新值,所以它甚至不像我可以对列表做任何聪明的事情。

我尝试先加载对象,然后再附加它,但这会产生重复键异常。

然后我尝试使用UpdateModel,即

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(int id, FormCollection col)
{ 
   var mt = context.MyTypes.Single( mt =>  mt.id = id);
   UpdateModel(mt);
   context.SubmitChanges(ConflictMode.FailOnFirstConflict);
}

这适用于审计,但无法通过乐观锁定。而不是 ChangeConflictException 我得到一个 InvalidOperationException 因为 UpdateModel 正在更改 concurrentTS 字段(这显然是只读的)。

我究竟做错了什么?

4

1 回答 1

0

到目前为止的进展包括完成最后一部分,捕获 InvalidOperationException 并查找文本“成员 'ConcurrencyTimestamp' 的值”,并将其作为 ChangeConflictException 重新抛出。

这似乎可以解决问题,但它并不漂亮。

于 2009-05-13T21:07:37.813 回答