Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “SubmitChanges()上的LINQ到SQL“2次更新中的1次失败”_C#_Sql Server_Linq To Sql - Fatal编程技术网

C# “SubmitChanges()上的LINQ到SQL“2次更新中的1次失败”

C# “SubmitChanges()上的LINQ到SQL“2次更新中的1次失败”,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我正在使用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; _conte

我正在使用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();
在提交更改时,我得到一个异常,2次更新中有1次失败,没有其他信息说明发生这种情况的原因。有什么想法吗

此外,异常类型为
ChangeConflictException

我不确定错误的确切原因,但您提供的示例似乎存在许多问题

在Where方法之前使用ToList会导致上下文将整个表从数据库读取到内存中,并将其转换为数组;然后在同一行中,您立即调用Where,Where将丢弃已加载但不需要的行。为什么不只是:

_context.X.Where

Where方法将返回多个项,但示例中的第二行似乎没有逐个遍历每个项。它似乎正在为集合本身设置DeletedOn属性,但集合不会有这样的属性。它应该在那里失败

您正在使用DateTime。现在在代码中使用了两次。这不是问题,只是每次调用它时都会产生稍微不同的日期值。您应该调用DateTime.Now一次,并将结果赋给一个变量,以便在其上使用的所有内容都获得相同的值

在Y objY=objYs[0]的点上,如果Y集合中没有任何给定X的项,它将失败。您将在数组上得到一个索引越界异常


所以在这个例子中,我不确定是否有人可以推测为什么按照这个例子建模的代码可能会被破坏

所以问题的原因是什么 -扳机

我做了一个sql分析器,看到了这一点

当ObjY的DeletedOn属性被更新时,触发器被更新 表CountOfX中ObjX的属性值

这导致了一个错误,因为linqtosql创建的SQL中有旧的CountOfX值

因此产生了冲突

如果您遇到此错误,SQL事件探查器是开始调查的最佳场所

也与问题无关
我正在测试LINQtoSQL和ADO.net框架,奇怪的是,这个错误发生在LINQtoSQL中,而不是ADO.net框架中。但是我喜欢LINQtoSQL,因为它的加载很慢。等待EF退出LINQ2SQL数据上下文关系图中的beta

,选择存储计数的实体和字段。非规范化图形


现在设置UpdateCheck=Never。

我遇到了这种问题。我一次调试一行代码。原来是另一个过程在修改这个记录

我的手动调试过程正在减慢函数的正常速度。当我在SubmitChanges方法之后一直运行到一行时,它成功了


我的情况可能不太常见,但此错误的性质与记录被另一个函数/进程取代有关。就我而言,这是另一个过程。

第一点同意第二点同意。这个例子写得不正确,后来我对它进行了更新,但代码是用RealLikFE编译的。第三个要点是的,这是为了测试保存是否会层叠第四个要点是的,集合中有项目在提交更改时出现异常我知道,除了错误本身没有透露太多。我认为它在您的真实代码中正确运行,否则您将无法到达报告错误的提交位置。这个例子没有给我们足够的信息来帮助你,因为这个例子还有其他问题。很高兴你似乎已经解决了这个问题:我在尝试删除时也犯了同样的错误。我向DeleteAllOnSubmit方法发送了一个列表,它从一开始就非常有效,但一个月后我出现了这个错误。当我从List改为IQueryable时,它起作用了。由于ADO.net framework只使用EntityKey值进行更新,因此该错误未在ADO.net framework中发生,即WHERE条件仅检查实体值,不是像LINQ2SQLSo这样的每一列值都有避免此错误的方法,除了完全避免触发器之外?有关LinqToSQL中冲突的信息,请参阅此链接:有一种方法可以控制整个过程。有关更好的解决方法,请参见此链接: