日期:2014-05-20  浏览次数:20759 次

Linq更新数据,Row not found or changed. 找不到行或行已更改
本帖最后由 zy41796745 于 2010-06-02 18:29:00 编辑
在使用Linq的时候经常出现在了这样的一个错误,Row not found or changed. 找不到行或行已更改,原因是频繁更新数据,导致数据库中数据与缓存中数据不一致,最终导致并发冲突。

解决方案。

如果不是重要的数据。不需要去理会并发重突。

一个简单的方案就是
打开dbml (linq)文件把实体类中的 属性 "Update check" 改为 Never.
主键(ID)就不要改了。


第二种方法. 不着征对一些记数情况的更新. 请直接用sql 语句,而不需要去取出整个数据然后再更新.这样就可能存在冲突了.

dC.ExecuteCommand("UPDATE [dbo].[MyTable] SET num=num+1 WHERE ID = @p0", m.ID);

 

第三种方法.

         try
                {
                    data.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
                }
                catch (System.Data.Linq.ChangeConflictException ex)
                {
                    foreach (System.Data.Linq.ObjectChangeConflict occ in data.ChangeConflicts)
                    {
                        //以下是解决冲突的三种方法,选一种即可

                        // 使用当前数据库中的值,覆盖Linq缓存中实体对象的值
                        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

                        // 使用Linq缓存中实体对象的值,覆盖当前数据库中的值
                        //occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

                        // 只更新实体对象中改变的字段的值,其他的保留不变
                        //occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
                    }

                    // 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值    //才会提交到数据库。
                    data.SubmitChanges();

                }


------解决方案--------------------
为什么这么喜欢使用 LINQ to SQL 呢, LINQ to SQL 默认都是使用开放式并发冲突,而 Entity Framework 默认则不处理并发冲突(乐观并发),生成的SQL就是LZ说的第二种方法。