Database LINQ刷新模式是如何工作的?

Database LINQ刷新模式是如何工作的?,database,linq,linq-to-sql,conflict,Database,Linq,Linq To Sql,Conflict,如果发生冲突,我需要用我的更改覆盖数据库中的值。我在MSDN上找到了以下文章,其中解释了如何使用刷新模式解决冲突: 我认为KeepCurrentValues符合我的要求,我还发现此页面包含此模式的示例: 然而,当我实现这个时,数据库中的值总是重写我的更改。我尝试将刷新模式更改为OverwriteCurrentValues和KeepChanges,每次保存数据库中的值时。我的方法是在VisualStudio的调试模式下手动更改数据库中的值。VS中的代码是: [MyDataContext] db

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

我认为KeepCurrentValues符合我的要求,我还发现此页面包含此模式的示例:

然而,当我实现这个时,数据库中的值总是重写我的更改。我尝试将刷新模式更改为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);
}

我知道会出现冲突,但无论我如何更改刷新模式,每次都不会保存值55,并且会保留我在数据库中手动进行的更改。有什么技巧可以达到预期的效果吗?起初我尝试从代码内部生成冲突,但也没有达到预期效果。也许我不明白刷新模式应该如何工作。欢迎任何意见。

您只需再次致电SubmitChanges

catch (ChangeConflictException)
{            
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);  
    db.SubmitChanges(); 
} 
冲突解决方法确定DataContext的状态,而不是基础数据库的状态

意味着保持所有值在DataContext中的当前状态,这意味着下一次调用SubmitChanges将保存用户所做的任何更改,但也将覆盖当前用户加载数据后其他用户所做的任何更改

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


OverwriteCurrentValues意味着使用当前数据库值更新DataContext,这意味着当前用户所做的所有更改都将被放弃。

在更改数据之前,您可以通过覆盖Db来刷新对象:

[MyLINQType] old = (from o in db.[MyLINQType] where o.ID=1 select o).Single();
Db.Refresh(RefreshMode.OverwriteCurrentValues, old);
old.IntField = 55;
db.SubmitChanges(ConflictMode.ContinueOnConflict);

非常感谢。我将尝试这个解决方案。确实是有用的解释。仅供参考:(和IntelliSense)指定
KeepCurrentValues
与此答案和链接到“如何”文章中的内容相反。在文档中:“KeepCurrentValues:强制刷新方法将原始值与从数据库检索的值交换。不修改当前值。”@davidmudoch“…将原始值与从数据库检索的值交换”在文档中的措辞很糟糕。“未修改当前值”是正确的。这意味着不会修改DataContext中缓存的当前值以匹配数据库中现有的任何值。在您链接的同一个文档上,底部的示例甚至有与以下答案匹配的正确注释://没有数据库值合并到当前值中。只有3个选项。。。“使用数据库中的一切”、“使用内存中的一切”、“使用最新数据”。我所读过的这个问题的最佳答案:)与经验证据相关!