System.Data.Linq.ChangeConflictException:未找到或更改行

San*_*San 61 .net c# linq

我试图使用LINQ(No LINQDataSource)删除选定的gridview行.

更改选择后,还会更改detailsview绑定.我可以向数据库添加一个新条目,但是当我将此代码添加到updatePanel内的删除按钮时,我得到一个异常:

try
{           
    var query = from i in db.QuestionModules 
                where i.QuestionModuleID == QuestionModuleID 
                select i;

    QuestionModule o = query.First();
    db.QuestionModules.DeleteOnSubmit(o);
    db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

System.Data.Linq.ChangeConflictException: Row not found or changed. at
System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode
failureMode) at
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges() 
Run Code Online (Sandbox Code Playgroud)

我已经有这个问题大约一个星期,无论我做什么,它仍然存在,并且记录不会被删除.

关于该怎么做的任何想法?

Mar*_*ark 69

好的 - 看起来好像(至少在我的情况下)答案是在DBML文件中将所有非主键列的UpdateCheck属性设置为Never.这样做立即解决了"未找到或未更改行"的问题.

鉴于有传言称微软正在将Linq-To-Sql推向实体框架,人们想知道是否会修复这些类型的错误?

  • 正如Mark在其他答案中所提到的,这是有效的,因为某些类型(例如`datetime2`具有高精度)未在服务器和客户端之间正确编组,而Linq-To-SQL的[乐观并发](https://msdn.microsoft) .com/en-us/library/bb399373%28v = vs.110%29.aspx)功能认为错误编组中的精度损失表明数据库更新了其值并中止了操作.将其翻转为"Never"会阻止乐观并发检查,因此(在这种情况下正确)成功. (7认同)

Sem*_*ike 53

您很可能会收到此错误,因为您的某个字段在Linq To SQL设计器和实际数据库中有不同之处.

在我的例子中,这是因为其中一个字段在数据库中可以为空并且在设计器中不可为空,使其在设计器中可以为空并立即解决问题.

  • DBML和数据库中的Missmatch是我的问题所在. (3认同)

Mar*_*ark 15

我遇到了同样的问题,并且遇到了这个博客,它基本上表明Linq-To-Sql在它的乐观并发方面遇到了问题,其中:

  1. 使用高精度日期时间字段.解决方案是将UpdateCheck设置为永远不会为该列设置DBML文件
  2. 设置为不可见的GridView列正在访问数据对象上的属性(第二个原因没有意义,但它似乎在该博客上风靡一时).

我还没有尝试过这些解决方案,但是一旦有了这些解决方案,我会回复这里.

  • +1我有这个问题,在SQL DB上有一个`float`字段,我在C#中映射到`float`(单一)类型.当我将类型更改为"double"时,问题就消失了.但是你的这个答案让我失望了 - 所以谢谢你! (2认同)

Fra*_*ock 15

我解决了这个问题,确保在更新之前立即刷新我的对象.我使用KeepChanges选项执行此操作.

    db.Refresh(System.Data.Linq.RefreshMode.KeepChanges, employee);
Run Code Online (Sandbox Code Playgroud)


小智 13

问题还可能只是表的DBML定义与数据库定义的状态不一致.我刚刚删除了DBML模型并从数据库中再次插入它,它工作正常.

希望这有助于某人.


Tra*_*vis 6

似乎也适合我的情况.我正在构建一个内存,从来没有提交过行,它与其他表中的行有几个外键关系.InsertOnSubmit似乎工作,但后续的DeleteOnSubmit给了我找不到行的错误.我没有填充我提交的行中的每个字段,所以我不知道是否与它有任何关系,但标记所有主表的非主键列消除了错误消息.

还有一个想法:我认为将列的UpdateCheck策略标记为"从不"意味着它不被用作乐观的可靠性检查的基础.这意味着两个用户可以在任何此类列中写入具有不同数据的给定行,并且不会检测到冲突...意味着提交该行的最后一个用户将覆盖先前用户提交的值.我从各种在线阅读中收集到,对此的一个部分解决方案是在提交之前立即使用Refresh方法来同步任何更改.当然,对行没有任何悲观锁定,无法保证在刷新和提交之间仍然不会更改行,但在涉及大型数据库的大多数情况下,这种情况很少见.

更新:进一步审查我认为我发现了一个可能影响其他人的情景,所以我想我会分享它以防万一.事实证明,至少我在SQL LINQ中遇到的部分麻烦与触发器有关.看来如果你使用SQL LINQ提交一行并且你的DBA有触发器设计用于将信息写入该行中的某些列,那么SQL LINQ模型将默认"始终"确定自上次写入以来该行已更改.我提交了部分填充的行,我们的DBA触发器填充了一些列,这样当我尝试进一步修改代码中的行时,它会根据触发器填充的列感知到更改冲突.我现在正在调查处理此问题的最佳方法,但更改这些触发填充字段以使用UpdateCheck策略"When Changed"或"Never"为我工作.希望能帮助到你.