>更改对象的属性Y(关联实体属性)
>尝试提交更改
>在这一点上,Y的值和X(底层密钥)的值不一致 – LINQ to sql在GetChangeSet被调用之前显然不同步.
>在更新操作期间由于某些业务逻辑或数据库级约束而导致预期的错误.
>此时,由于GetChangeSet被调用,Y的值与X一致.
>将Y的值更改为Nothing(也称为null).
>调用GetChangeSet.
由于X的值和X(由GetOriginalEntityState返回)的值不同,新值与Y不一致,所以最后一步出现错误.是为什么?这是LINQ to sql中的一个错误.必须是因为我在第5步中将Y更改为另一个(非空)值时看不到相同的行为.我可以看几种方法:
>发生错误时丢弃DataContext,并按原样离开UI.我不喜欢这样,因为那么乐观的并发改变冲突是无法检测到的.新的上下文没有在UI中填充UI的原始值,所以如果UI中有任何陈旧的值,它们将导致数据库中的数据恢复.
>刷新数据文本(OverwriteCurrent),并按原样离开UI.我不喜欢这个与#1相同的原因.
>刷新数据文本(OverwriteCurrent)并重新填充UI.我不喜欢这个,因为刚才提交给用户的错误消息不会向用户显示他们所做的错误,并允许用户对其进行更正.它也会丢弃用户可能做出的所有其他更改.
>当发生错误时,显式地检索对应于X的原始值并重置Y的Y的密钥,然后调用GetChangeSet来重新同步X(X是只读或私有的,因此我不能直接重置).这似乎工作,但似乎是一个黑客,可能需要大量代码为其他类似的错误.
有没有更好的解决方案.这是应该报告的东西吗?
解决方法
对于关系的更新,从子到父的引用(即对应于外键的引用)被认为是权限.相反方向(即从父母到子级)的引用是可选的.关系类(EntitySet和EntityRef)保证双向引用对于一对多和一对一关系是一致的.如果对象模型不使用EntitySet或EntityRef,并且如果存在反向引用,那么在更新关系时,您有责任保持与转发引用一致.
如果您更新所需的引用和相应的外键,则必须确保它们同意.如果两个在您调用SubmitChanges时不同步,则抛出InvalidOperationException异常.虽然外键值更改足以影响基础行的更新,但您应该更改引用以维护对象图的连接性和双向关系的一致性.
http://msdn.microsoft.com/en-us/library/Bb386982(v=VS.90).aspx