万一发生冲突,我需要使用自己的更改覆盖数据库中的值。我在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,并且每次保存数据库中的值时都尝试过。我的方法是在Visual Studio的 Debug模式下手动更改数据库中的值。 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);
}

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

最佳答案

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

catch (ChangeConflictException)
{
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
    db.SubmitChanges();
}

冲突解决方法确定DataContext的状态,而不是基础数据库的状态。

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

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

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

关于database - LINQ RefreshMode如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5483672/

10-10 22:19