当提交带有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
, origVal
和databaseVal
的值时,我看到currVal
中保存的XML数据是我基于错误所期望的(它缺少两个元素),而origVal
和databaseVal
的XML是相同的。这不应该引起冲突,对吧?
更奇怪的是,当我通过为缺失的元素提供正确的(根据数据库)值来手动纠正错误时,就在.SubmitChanges()
调用之前,它仍然导致冲突,即使来自所有三个(currVal
, origVal
和databaseVal
)的XML现在看起来都一样。
谁能指出是什么导致了冲突?
编辑:好,这有点令人惊讶,但即使我在提交更改之前从未设置检索实体的content_xml
属性值,我仍然会在XML字段上得到冲突。
我猜测更改冲突源于L2S以不正确的方式比较旧值和新值。
一个可能的解决方法是向表中添加时间戳或rowversion列,并更新L2S模型。如果一个表包含rowversion/timestamp, 只有这一列将被用于检测更改冲突…