我想放弃对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的工作流程以使所有这些工作一起工作?
那些不是聪明的解决方案:
答案 0 :(得分:6)
为了补充约翰内斯所说的话,我认为这里的混淆源于将DataContext
视为类似于DataSet
的东西。事实并非如此。
DataContext
中的“表”就像是如何从数据库中检索特定类型的数据实体的提示。与DataSet
不同,DataContext
实际上并不“包含”数据,它只是跟踪您从中拉出的离散实体。如果DataContext
消失(处置),实体仍然有效,它们只是分离。这与DataSet
不同,DataTables
和DataRows
基本上与其容器绑定,并且不能超过它们。
为了使用Refresh
的{{1}}方法,您需要在实际实体或实体集合上使用它。你不能“刷新”DataContext
,因为它实际上不是一个物理表,它只是一种参考。
只有在调用Table<T>
方法时,才会保留与DataContext
相关联的实体的更改。如果您丢弃SubmitChanges
,除非您手动将已分离的实体重新附加到新的DataContext
,否则绝对无法保留更改。
答案 1 :(得分:3)
只需丢弃当前的DataContext而不调用SubmitChanges()并获取一个新的。
示例:
DataContext myOldDc = new DataContext();