我有一个表示客户的业务对象类型,当调用其.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
。
我不理解的部分是,在检查currVal
,origVal
和databaseVal
的值时,我发现currVal
中保存的XML数据就是我想要的期望基于错误(它缺少两个元素),origVal
和databaseVal
的XML是相同的。那不应该引起冲突吗?
更奇怪的是,当我通过在.SubmitChanges()
调用之前为缺少的元素提供正确的(根据数据库)值来手动纠正错误时,仍然是导致冲突,即使所有三个(currVal
,origVal
和databaseVal
)的XML现在看起来都相同。
有人可以提出可能导致冲突的原因吗?
修改
好的,这有点令人惊讶,但即使我在提交更改之前从未设置检索到的实体的content_xml
属性值,我仍然会在XML上发生冲突字段。
答案 0 :(得分:0)
我猜测更改冲突源于L2S以不正确的方式比较xml字段的旧值和新值。
可能的解决方法是向表中添加时间戳或rowversion列并更新L2S模型。如果一个表包含rowversion / timestamp, only 该列将用于检测更改冲突......