在Linq to SQL的DataContext上,我可以调用SubmitChanges()来提交所有更改.
我想要的是以某种方式拒绝datacontext中的所有更改并回滚所有更改(最好不要转到数据库).
这可能吗?
为什么不丢弃数据上下文并简单地用新实例替换它?
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 - 放弃待定更改
在.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在他的评论中写的那样.
正如Haacked所说,只需删除数据上下文.
您可能不应该长时间保持数据上下文存活.它们被设计为以事务方式使用(即每个原子工作单元一个数据上下文).如果长时间保持数据上下文存活,则在更新陈旧实体时会产生更大的生成并发异常的风险.
在Updates,Deletes和Inserts集合上调用Clear()不起作用.
GetOriginalEntityState()可能很有用,但它只提供外键关系的ID,而不是实际的实体,所以你留下了一个分离的对象.
这篇文章解释了如何从数据上下文中删除更改:http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext
编辑:调用Refresh()将撤消更新,但不删除和插入.