我试图使用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推向实体框架,人们想知道是否会修复这些类型的错误?
Sem*_*ike 53
您很可能会收到此错误,因为您的某个字段在Linq To SQL设计器和实际数据库中有不同之处.
在我的例子中,这是因为其中一个字段在数据库中可以为空并且在设计器中不可为空,使其在设计器中可以为空并立即解决问题.
Mar*_*ark 15
我遇到了同样的问题,并且遇到了这个博客,它基本上表明Linq-To-Sql在它的乐观并发方面遇到了问题,其中:
我还没有尝试过这些解决方案,但是一旦有了这些解决方案,我会回复这里.
Fra*_*ock 15
我解决了这个问题,确保在更新之前立即刷新我的对象.我使用KeepChanges选项执行此操作.
db.Refresh(System.Data.Linq.RefreshMode.KeepChanges, employee);
Run Code Online (Sandbox Code Playgroud)
似乎也适合我的情况.我正在构建一个内存,从来没有提交过行,它与其他表中的行有几个外键关系.InsertOnSubmit似乎工作,但后续的DeleteOnSubmit给了我找不到行的错误.我没有填充我提交的行中的每个字段,所以我不知道是否与它有任何关系,但标记所有主表的非主键列消除了错误消息.
还有一个想法:我认为将列的UpdateCheck策略标记为"从不"意味着它不被用作乐观的可靠性检查的基础.这意味着两个用户可以在任何此类列中写入具有不同数据的给定行,并且不会检测到冲突...意味着提交该行的最后一个用户将覆盖先前用户提交的值.我从各种在线阅读中收集到,对此的一个部分解决方案是在提交之前立即使用Refresh方法来同步任何更改.当然,对行没有任何悲观锁定,无法保证在刷新和提交之间仍然不会更改行,但在涉及大型数据库的大多数情况下,这种情况很少见.
更新:进一步审查我认为我发现了一个可能影响其他人的情景,所以我想我会分享它以防万一.事实证明,至少我在SQL LINQ中遇到的部分麻烦与触发器有关.看来如果你使用SQL LINQ提交一行并且你的DBA有触发器设计用于将信息写入该行中的某些列,那么SQL LINQ模型将默认"始终"确定自上次写入以来该行已更改.我提交了部分填充的行,我们的DBA触发器填充了一些列,这样当我尝试进一步修改代码中的行时,它会根据触发器填充的列感知到更改冲突.我现在正在调查处理此问题的最佳方法,但更改这些触发填充字段以使用UpdateCheck策略"When Changed"或"Never"为我工作.希望能帮助到你.