如何放弃对所有linq表所做的更改?

时间:2010-01-21 15:15:24

标签: c# database linq datacontext

我想放弃对linq表所做的所有更改(这意味着 - 我使用linq,数据在客户端更改,服务器上的数据完好无损)。怎么做?

编辑:问题部分解决了

http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext/

只要您不使用交易,它就会起作用。当你这样做并且你使用混合“模式”进行记录时,会出现问题:

begin trans
insert a record
update inserted record
commit trans

当您更新上述记录时,Linq会将其计为更新记录,如果出现异常,则会有两个操作 - 事务将被回滚,Linq端的数据将被丢弃。在丢弃更改时,Linq尝试从数据库中获取它(丢弃更新意味着为记录重新获取数据),但由于所有更改都已回滚,因此没有更新记录。

问题

如何以智能通用方式改进DiscardChanges方法以处理事务。或者如何更改事务/ discard-submitchanges的工作流程以使所有这些工作一起工作?

那些不是聪明的解决方案:

  1. 重新提取所有数据
  2. 重新创建与DB的连接(因为它导致(1))

2 个答案:

答案 0 :(得分:6)

为了补充约翰内斯所说的话,我认为这里的混淆源于将DataContext视为类似于DataSet的东西。事实并非如此。

DataContext中的“表”就像是如何从数据库中检索特定类型的数据实体的提示。与DataSet不同,DataContext实际上并不“包含”数据,它只是跟踪您从中拉出的离散实体。如果DataContext消失(处置),实体仍然有效,它们只是分离。这与DataSet不同,DataTablesDataRows基本上与其容器绑定,并且不能超过它们。

为了使用Refresh的{​​{1}}方法,您需要在实际实体或实体集合上使用它。你不能“刷新”DataContext,因为它实际上不是一个物理表,它只是一种参考。

只有在调用Table<T>方法时,才会保留与DataContext相关联的实体的更改。如果您丢弃SubmitChanges,除非您手动将已分离的实体重新附加到新的DataContext,否则绝对无法保留更改。

答案 1 :(得分:3)

只需丢弃当前的DataContext而不调用SubmitChanges()并获取一个新的。

示例:

DataContext myOldDc = new DataContext();