我正在尝试在 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 字段(这显然是只读的)。
我究竟做错了什么?