使用XML字段提交LINQ实体时的ChangeConflictException

时间:2014-05-14 12:13:32

标签: c# linq exception

我有一个表示客户的业务对象类型,当调用其.Save()方法时,会尝试根据对象的ID属性从数据库中检索(使用LINQ)匹配的实体。如果找到匹配的实体,它会创建一个新实体;如果确实找到匹配的实体,则会更新该实体的属性并调用[my datacontext].SubmitChanges()

最后一部分是问题所在。用户的大部分数据都存储在数据库的XML字段中,名为content_xml。代码中存在一个错误,即在构造业务对象时无法检索其中的两个数据项(“coordinates”和“sales_groups”),因此当.Save()方法更新实体时,XML它的发送缺少这些元素。

由于某种原因,这会引发ChangeConflictException,声明“12个中的1个”更新失败。为了找出导致问题的原因,我使用了http://msdn.microsoft.com/en-us/library/Bb386985%28v=vs.100%29.aspx中的代码来提取有关变更冲突的信息。

由此我发现[my datacontext].ChangeConflicts包含一个ObjectChangeConflict,其本身包含一个代表XML字段的MemberChangeConflict

我不理解的部分是,在检查currValorigValdatabaseVal的值时,我发现currVal中保存的XML数据就是我想要的期望基于错误(它缺少两个元素),origValdatabaseVal的XML是相同的。那不应该引起冲突吗?

更奇怪的是,当我通过在.SubmitChanges()调用之前为缺少的元素提供正确的(根据数据库)值来手动纠正错误时,仍然是导致冲突,即使所有三个(currValorigValdatabaseVal)的XML现在看起来都相同。

有人可以提出可能导致冲突的原因吗?

修改

好的,这有点令人惊讶,但即使我在提交更改之前从未设置检索到的实体的content_xml属性值,我仍然会在XML上发生冲突字段。

1 个答案:

答案 0 :(得分:0)

猜测更改冲突源于L2S以不正确的方式比较xml字段的旧值和新值。

可能的解决方法是向表中添加时间戳或rowversion列并更新L2S模型。如果一个表包含rowversion / timestamp, only 该列将用于检测更改冲突......