附加方案中的linq datacontext GetModifiedMembers

时间:2009-05-12 21:25:38

标签: asp.net-mvc auditing optimistic-locking

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

审计框架依赖于能够在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字段(显然是readonly)。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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