当前位置:  开发笔记 > 数据库 > 正文

如何拒绝Linq to SQL的DataContext中的所有更改?

如何解决《如何拒绝LinqtoSQL的DataContext中的所有更改?》经验,为你挑选了5个好方法。

在Linq to SQL的DataContext上,我可以调用SubmitChanges()来提交所有更改.

我想要的是以某种方式拒绝datacontext中的所有更改并回滚所有更改(最好不要转到数据库).

这可能吗?



1> Haacked..:

为什么不丢弃数据上下文并简单地用新实例替换它?


因为我可能有通过上下文获取的对象,我可能希望稍后更改/使用它.如果我丢弃数据上下文,我必须再次获取这些对象.这是一个Windows服务,其中datacontext存在很长时间.
DataContext意味着在_unit of work_方法中使用,因此不打算长期存在.请参阅:[LINQ to SQL DataContext的生命周期](http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/04/27/lifetime-of-a-linq-to-sql-datacontext. ASPX)

2> 小智..:
public static class DataContextExtensions
{
    /// 
    ///     Discard all pending changes of current DataContext.
    ///     All un-submitted changes, including insert/delete/modify will lost.
    /// 
    /// 
    public static void DiscardPendingChanges(this DataContext context)
    {
        context.RefreshPendingChanges(RefreshMode.OverwriteCurrentValues);
        ChangeSet changeSet = context.GetChangeSet();
        if (changeSet != null)
        {
            //Undo inserts
            foreach (object objToInsert in changeSet.Inserts)
            {
                context.GetTable(objToInsert.GetType()).DeleteOnSubmit(objToInsert);
            }
            //Undo deletes
            foreach (object objToDelete in changeSet.Deletes)
            {
                context.GetTable(objToDelete.GetType()).InsertOnSubmit(objToDelete);
            }
        }
    }

    /// 
    ///     Refreshes all pending Delete/Update entity objects of current DataContext according to the specified mode.
    ///     Nothing will do on Pending Insert entity objects.
    /// 
    /// 
    /// A value that specifies how optimistic concurrency conflicts are handled.
    public static void RefreshPendingChanges(this DataContext context, RefreshMode refreshMode)
    {
        ChangeSet changeSet = context.GetChangeSet();
        if (changeSet != null)
        {
            context.Refresh(refreshMode, changeSet.Deletes);
            context.Refresh(refreshMode, changeSet.Updates);
        }
    }
}

请参阅Linq to SQL - 放弃待定更改



3> Alexander Zw..:

在.net 3.0中,使用db.GetChangeSet().Updates.Clear()for更新,db.GetChangeSet().Inserts.Clear()db.GetChangeSet().Deletes.Clear()项目或已删除项目.

在.net 3.5及更高版本中,GetChangeSet()的结果现在是readonly,循环集合in for或foreach并刷新每个ChangeSet表,就像macias在他的评论中写的那样.


这是接受的答案?这不起作用 - Updates/Inserts/Deletes集合是只读的.MSDN文档说这些集合是"在调用时计算的"(GetChangeSet()).http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getchangeset.aspx

4> Richard Pool..:

正如Haacked所说,只需删除数据上下文.

您可能不应该长时间保持数据上下文存活.它们被设计为以事务方式使用(即每个原子工作单元一个数据上下文).如果长时间保持数据上下文存活,则在更新陈旧实体时会产生更大的生成并发异常的风险.



5> Graeme Hill..:

在Updates,Deletes和Inserts集合上调用Clear()不起作用.

GetOriginalEntityState()可能很有用,但它只提供外键关系的ID,而不是实际的实体,所以你留下了一个分离的对象.

这篇文章解释了如何从数据上下文中删除更改:http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext

编辑:调用Refresh()将撤消更新,但不删除和插入.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有