linq更新数据冲突问题解决

linq更新数据时,产生冲突,出现类似 "找不到行或行已更改" 的错误。

解决方法:

在提交的时候,不要SubmitChanges()直接提交,采用如下方式

using (DataContext dc = new DataContext(Common.GetDBConnStr()))
            {
                try
                {
                    Permissions.Modal.Module module = (from mod in dc.GetTable<Permissions.Modal.Module>()
                                                       where mod.ID == id
                                                       select mod)
                                  .FirstOrDefault<Permissions.Modal.Module>();
                    module.Name = moduleName;
                    module.State = state;
                    dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
                    return true;
                }
                catch (System.Data.Linq.ChangeConflictException)
                {
                    foreach (System.Data.Linq.ObjectChangeConflict occ in dc.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方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值 //才会提交到数据库。
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception) { return false; }
            }

 

或者更简单的方式是,对需要更新的字段在实体类中加如下限制:[Column(UpdateCheck=UpdateCheck.Never)]

posted @ 2010-08-26 14:57  山村果园  阅读(546)  评论(1编辑  收藏  举报