在我的数据层类中,我创建了一个手动刷新数据源的函数。
Public Sub DiscardAllChanges()
_Context.Refresh(RefreshMode.OverwriteCurrentValues)
End Sub
问题是此操作后的上下文 ChangeSet 仍然跟踪我手动调用的插入,删除和更新的上一个操作 InsertOnSubmit 等。
是否有可能以某种方式清除ChangeSet?或者如果没有,你能建议我另一个解决方案吗我是否必须在业务中创建ChangeSet层?
答案 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);