当前位置: 代码迷 >> ASP.NET >> Linq To Sql的有关问题(关于同步更新)
  详细解决方案

Linq To Sql的有关问题(关于同步更新)

热度:6142   发布时间:2013-02-25 00:00:00.0
Linq To Sql的问题(关于同步更新)
我用linq to sql的时候,如果我正在进行数据操作,而另一个人对数据库进行改变的时候,会出现数据已经改变的异常,我应该怎么处理。  举个例子,我要减少数据库中产品的数量,但我不能让他的库存小于零,所以我要先去判断,如果大于零的时候我才提交改变,而在我判断的时候,发现数据库手动改变产品数量时,这里并不会减少我查询的产品的数量,提交改变也会报异常。我应该怎么处理。。
------最佳解决方案--------------------------------------------------------
使用 Linq时,Linq会把数据库的数据缓存到实体对象中,在做更新操作时,Linq会默认把除更新字段外的所有字段,作为Update语句中的Where条件(这个可以加断点调试查询Linq的UPdate语句)。如果此时有另外的程序,在访问数据库,并修改数据库数据的时候,此时Linq缓存起来的数据和实际数据库中的数据产生了不一致的情况。但是Linq仍然把被修改过的字段,作为Update的Where条件,由于数据库中的某个字段的数据被修改了,所以Where条件始终匹配不到原有的数据,这时,就会抛出所谓的:“System.Data.Linq.ChangeConflictException: Row not found or changed.”异常。 
产生此异常,主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况:
[code=csharp]
try {  
              db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 
            }  
        catch (System.Data.Linq.ChangeConflictException ex)  
            {     
                foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)   
                    {  
                        //以下是解决冲突的三种方法,选一种即可  
                        //使用当前数据库中的值,覆盖Linq缓存中实体对象的值 
                        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);          
                        //使用Linq缓存中实体对象的值,覆盖当前数据库中的值  
                        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);          
                        //只更新实体对象中改变的字段的值,其他的保留不变 
                        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);  
                    }    
                db.SubmitChanges();  
            }code]
------其他解决方案--------------------------------------------------------
引用:
我用linq to sql的时候,如果我正在进行数据操作,而另一个人对数据库进行改变的时候,会出现数据已经改变的异常,我应该怎么处理。  举个例子,我要减少数据库中产品的数量,但我不能让他的库存小于零,所以我要先去判断,如果大于零的时候我才提交改变,而在我判断的时候,发现数据库手动改变产品数量时,这里并不会减少我查询的产品的数量,提交改变也会报异常。我应该怎么处理。。
 ……

查transaction/SELECT  FROM TABLE WITH (TABLOCKX)
这是个比较复杂的事情,要谨慎一点
------其他解决方案--------------------------------------------------------
  相关解决方案