如何在LINQ to SQL中撤消ChangeSet

时间:2009-01-19 08:35:10

标签: .net linq-to-sql

在我的数据层类中,我创建了一个手动刷新数据源的函数。

Public Sub DiscardAllChanges()

    _Context.Refresh(RefreshMode.OverwriteCurrentValues)

End Sub

问题是此操作后的上下文 ChangeSet 仍然跟踪我手动调用的插入,删除和更新的上一个操作 InsertOnSubmit 等。

是否有可能以某种方式清除ChangeSet?或者如果没有,你能建议我另一个解决方案吗我是否必须在业务中创建ChangeSet层?

3 个答案:

答案 0 :(得分:5)

处理此问题的最简单方法是将DataContext视为您的工作单位。在单个DataContext上执行相关操作的原子集,然后在成功或失败后Dispose()(理想情况下通过using)并将其扔掉。

在新的DataContext上启动下一组操作。同样,您可以重新查询数据。

在逐个对象的基础上,您可以使用GetOriginalEntityState(在表格上)来获取原始值,但是您需要重新应用于“实时”对象,这不会处理删除/插入案例。

答案 1 :(得分:1)

听起来像是在尝试处理并发问题?这是您提交时,数据库已经更改,导致您的提交失败。如果这是您的追随者,请告诉我:

DataClasses1DataContext dc = new DataClasses1DataContext();
try
{
    dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
catch (System.Data.Linq.ChangeConflictException ex)
{
    foreach (var conflict in dc.ChangeConflicts)
    {
        conflict.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
    }
    dc.SubmitChanges();
}

这种模式在并发问题上为您带来了沉重的负担。 RefreshMode具有重载以强制您的更改,刷新最新值除了更改,或让数据库覆盖您的更改。然后,您可以再次提交。请注意,提交完整是一个递归过程,您提交更改的后续调用也可能失败。

答案 2 :(得分:0)

dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,item);