首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Linq更新数据,Row not found or changed. 找不到行或行已更动

2012-08-28 
Linq更新数据,Row not found or changed. 找不到行或行已更改在使用Linq的时候经常出现在了这样的一个错误

Linq更新数据,Row not found or changed. 找不到行或行已更改
在使用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说的第二种方法。

开放式并发就是LZ说的“Row not found or changed”的根源。
[解决办法]
ding tie you fen

热点排行