当提交带有XML字段的LINQ实体时,改变了econflictexception

本文关键字:实体 改变 econflictexception LINQ 提交 XML 字段 | 更新日期: 2023-09-27 18:03:13

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

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

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

由此,我看到[my datacontext].ChangeConflicts包含单个ObjectChangeConflict,它本身包含单个MemberChangeConflict表示XML字段。

我不明白的部分是,当检查currVal, origValdatabaseVal的值时,我看到currVal中保存的XML数据是我基于错误所期望的(它缺少两个元素),而origValdatabaseVal的XML是相同的。这不应该引起冲突,对吧?

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

谁能指出是什么导致了冲突?

编辑:

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

当提交带有XML字段的LINQ实体时,改变了econflictexception

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

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