Tom*_*len 18 c# linq asp.net conflict linq-to-sql
Error Message: Row not found or changed.
Stack Trace:
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
Run Code Online (Sandbox Code Playgroud)
这似乎是随机发生的.我通过电子邮件发送了这些错误,并且报告的URL似乎总是对我有用,并且应该也适用于其他所有人.
我可以通过以下方式解决此错误
dbml布局Update Check为Never这似乎可以防止抛出这些类型的错误.
然而,每当我有机会dmbl,添加新表等时,记住继续这样做是很费力的.有没有更好的方法来解决这个问题?我每天可能会得到50-100这对我的访客来说很糟糕.
Mik*_*ney 29
每次我看到这个错误,都意味着在我加载记录/对象/任何东西和我试图保存它的时间之间数据库中发生了变化.没错,那是因为我的工作单位太大了.
我不知道您的应用程序的确切性质,但我假设您正在创建数据上下文,加载记录或记录列表,对其执行某些操作,咀嚼一些时间和处理器周期,然后在结束尝试将修改后的数据保存回数据库.甚至可能加载一个记录/对象的实例并将其存储在类变量中一段时间,然后在页面加载或线程的末尾或任何试图保存更改的内容.问题是因为LINQ存储了它的副本,即它想要更新的副本.如果基础数据在此期间发生变化,那就会发疯.
问问自己,如果您在对象的整个生命周期内对数据进行锁定事务会怎样.说你加载的任何东西都可以修改,在此期间没有其他人可以接触它.基本上这就是这里的假设.当然,LINQ对它更加乐观,如果您可能永远不会更新数据,那么锁定行或表是没有意义的,但您会考虑这些问题.问问自己,如果要对对象进行严格的事务锁定会导致什么会破坏或显着减慢,这可能会指向违规代码.
我的解决方案是尽可能减少我的工作单元.不要加载对象并将其用作工作副本并将其存储回数据库,所有这些都在一个上下文中.相反,加载对象并在一个步骤中提取所需的信息,然后找出需要应用的更改,然后加载/更新/保存对象.当然它会导致更多往返数据库,但可以更好地保证您正在使用最新的数据副本.它仍将是"最后赢,赢",这意味着如果有人在您处理数据时进行了更新,则可能会丢失,但除非您使用事务锁定记录,否则这总是存在风险.但是,如果其他人正在修改同一行中不相关的字段,那么它确实会为您带来灵活性,您可以同时对这些数据进行操作.