我正在尝试在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)。
我做错了什么?
答案 0 :(得分:0)
到目前为止,进展包括完成最后一部分,捕获InvalidOperationException并查找文本“成员的值'ConcurrencyTimestamp'”,并将其重新抛出为ChangeConflictException。
这似乎可以解决问题,但它并不漂亮。