LINQ RefreshMode如何工作?

Ioa*_*rcu 12 linq database conflict linq-to-sql

如果发生冲突,我需要用我的更改覆盖数据库中的值.我在MSDN上找到以下文章,解释了如何使用RefreshMode解决冲突:

http://msdn.microsoft.com/en-us/library/system.data.linq.refreshmode.aspx

我决定KeepCurrentValues对我的要求有意义,我也发现这个页面有一个这个模式的例子:

http://msdn.microsoft.com/en-us/library/bb399421.aspx

但是当我实现它时,数据库中的值总是覆盖我的更改.我尝试将RefreshMode更改为OverwriteCurrentValues和KeepChanges,并且每次保存数据库中的值.我的方法是在VisualStudio的调试模式下手动更改数据库中的值.VS中的代码是:

[MyDataContext] db = new [MyDataContext]();
try
{
    [MyLINQType] old = (from o in db.[MyLINQType] where o.ID=1 select o).Single();
    old.IntField = 55;

    // This is where I change the IntField value manually in the database in
    // debug mode to generate the conflict.
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException)
{
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
}
Run Code Online (Sandbox Code Playgroud)

我知道冲突会出现,但每次,无论我如何更改RefreshMode,都不会保存值55,并保留我在数据库中手动进行的更改.是否有一些技巧可以达到预期的效果?我一开始尝试从代码内部生成冲突,但也没有按预期工作.也许我不明白RefreshMode应该如何工作.欢迎任何想法.

CFi*_*nck 15

你只需要再次调用SubmitChanges ......

catch (ChangeConflictException)
{            
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);  
    db.SubmitChanges(); 
} 
Run Code Online (Sandbox Code Playgroud)

冲突解决方法确定DataContext的状态,而不是底层数据库.

KeepCurrentValues表示保留当前在DataContext中的所有值,这意味着下次调用SubmitChanges将保存用户所做的任何更改,但它也会覆盖当前用户加载数据后其他用户所做的任何更改.

KeepChanges意味着只保留自加载到DataContext以来已更改的值,这意味着下次调用SubmitChanges将保存用户所做的任何更改,并保留其他用户所做的任何更改.并且,如果另一个用户更改了与当前用户相同的值,则当前用户的更改将覆盖它.

OverwriteCurrentValues表示使用当前数据库值更新DataContext,这意味着将丢弃当前用户所做的所有更改.

  • @DavidMurdoch"......将原始值与从数据库中检索到的值进行交换"只是文档中的措辞不佳."未修改当前值"是正确的.这意味着不会修改DataContext中缓存的当前值以匹配数据库中现有的任何值.在您链接的同一个文档中,底部的示例甚至具有与此答案匹配的正确注释:"//没有数据库值合并到当前." 只有3个选项......"使用数据库中的所有内容","使用内存中的所有内容","使用最新数据". (2认同)