【问题标题】:How do you clear changes in LinqToSql?如何清除 LinqToSql 中的更改?
【发布时间】:2009-07-21 10:15:37
【问题描述】:

我的 WPF 应用程序中有一个组合框,它数据绑定到我的视图模型中的对象列表。当用户对所选对象进行更改,然后在保存前选择另一个项目时,我需要清除所做的更改。

我以为我可以使用 dataContext.GetChangeSet().Updates.Clear() 但由于某种原因该集合是只读的。

我也尝试过使用 dataContext.Refresh 但这也不起作用,因为该对象在数据库中不存在,我是从 SP 手动创建的。

请帮忙。谢谢。

【问题讨论】:

    标签: c# wpf linq-to-sql datacontext


    【解决方案1】:

    除了使用 Marc 的方法使用 DeleteOnSubmit(或 DeleteAllOnSubmit)删除插入内容外,以下内容实际上也将撤消任何更新:

    // clears any updates.  
    ChangeSet changes = dataContext.GetChangeSet();
    dataContext.Refresh(RefreshMode.OverwriteCurrentValues, changes.Updates);   
    

    【讨论】:

    • 但我想没有必要清除插入,因为您可以将 InsertOnSubmit() 放入取决于对话结果的 if-else 块中。
    • 明确一点,这不会删除插入,如果你在changes.Inserts 上尝试它,它会抛出异常,因为有待处理的插入,这对我来说真的很奇怪。跨度>
    【解决方案2】:

    您最好的选择可能是重新查询到单独的数据上下文。您可以通过使用DeleteOnSubmit(反之亦然)来否定插入(来自变更集),但我自己不想这样做。

    【讨论】:

    • 所以你是说基本上创建一个新的数据上下文并再次获取数据?如果是这样,那么这非常慢,因为我的收藏中有很多物品。我希望在某处保存该对象的副本,以便可以回滚任何更改(如撤消功能)。
    • 变更跟踪器中有旧版本;但是数据上下文的想法是让它成为一个工作单元;不是数据库。 IMO,听起来您只是将太多数据加载到其中...
    • 哦,好的,我可以使用旧版本,请问在哪里?我同意你关于加载太多的观点,但我看不到替代方案,谢谢。
    • GetOriginalEntityState() 在每个表上
    • 在我看来,重新查询到单独的数据上下文是一个坏主意。如果您不刷新所有表,则可能会发生“相同键”错误。如果您进行刷新并使用立即获取,这可能是一项昂贵的操作。我会使用 HAdes 的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多