在Linq to SQL的DataContext上,我可以调用SubmitChanges()来提交所有更改.
我想要的是以某种方式拒绝datacontext中的所有更改并回滚所有更改(最好不要转到数据库).
这可能吗?
Haa*_*ked 30
为什么不丢弃数据上下文并简单地用新实例替换它?
小智 18
public static class DataContextExtensions
{
/// <summary>
/// Discard all pending changes of current DataContext.
/// All un-submitted changes, including insert/delete/modify will lost.
/// </summary>
/// <param name="context"></param>
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);
}
}
}
/// <summary>
/// Refreshes all pending Delete/Update entity objects of current DataContext according to the specified mode.
/// Nothing will do on Pending Insert entity objects.
/// </summary>
/// <param name="context"></param>
/// <param name="refreshMode">A value that specifies how optimistic concurrency conflicts are handled.</param>
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*aum 10
在.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()将撤消更新,但不删除和插入.
归档时间: |
|
查看次数: |
23430 次 |
最近记录: |