[英]LINQ to SQL “1 of 2 Updates failed” on “SubmitChanges()”
我正在使用LINQ to SQL更新X类型的对象及其子对象Y,然后提交更改并得到此错误
范例程式码
X objX = _context.X.ToList().Where(x => x.DeletedOn == null).First();
objX.DeletedOn = DateTime.Now;
EntitySet<Y> objYs = objX.Ys;
Y objY = objYs[0];
objY.DeletedOn = DateTime.Now;
_context.SubmitChanges();
在SubmitChanges()上,我得到一个异常“ 2个更新中的1个失败”,没有其他信息说明发生这种情况的原因。 有任何想法吗?
另外,异常类型是ChangeConflictException
找出问题的原因是什么-触发
我做了一个SQL事件探查器,看到了
当ObjY的DeletedOn属性更新时,触发器更新了ObjX的属性(表中的值),称为CountOfX
这导致错误,因为LINQ to SQL创建的SQL中包含旧的CountOfX值。
因此发生了冲突。
如果您遇到此错误-SQL事件探查器是开始调查的最佳位置
在LINQ 也不涉及这个问题我测试LINQ to SQL和ADO.net框架,正巧SQL但不是在ADO.net框架古怪此错误。 但是我喜欢LINQ to SQL的延迟加载功能。 等待EF退出测试版
我不确定导致错误的原因到底是什么,但是您提供的示例似乎存在许多问题。
在Where()方法之前使用ToList()会导致您的上下文将整个表从DB读取到内存中,并将其转换为数组; 然后在同一行中立即调用Where,它将丢弃您已加载但不需要的行。 为什么不只是:
_context.X.Where(...
Where方法将返回多个项目,但是示例中的第二行似乎并未分别遍历每个项目。 它似乎在为集合本身设置DeletedOn属性,但是该集合没有这样的属性。 它应该在那里失败。
您在代码中两次使用DateTime.Now。 没问题,只是每次调用都会产生稍有不同的日期值。 您应该调用一次DateTime.Now并将结果分配给一个变量,以便您使用它的所有内容都具有相同的值。
在您拥有“ Y objY = objYs [0]”的地方,如果任何给定X的Y集合中没有任何项目,它将失败。您将在数组上获得索引超出范围的异常。
因此,在给出此示例的情况下,我不确定是否有人可以推测为什么在此示例之后建模的代码可能会中断。
在LINQ2SQL数据上下文图中,选择实体和存储计数的字段。 (非正规化的数字)
现在设置UpdateCheck = Never。
我有这种问题。 我一次调试一行。 事实证明,另一个过程正在修改此记录。
我的手动调试过程降低了该功能的正常速度。 当我将它一直运行到SubmitChanges方法之后的一行时,它成功了。
我的情况不太常见,但是此错误的性质与记录被另一个功能/进程取代有关。 就我而言,这是另一个过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.