C# 如何放弃对所有linq表所做的更改?
我想放弃对linq表所做的所有更改(这意味着——我使用linq,数据在客户端更改,服务器上的数据保持不变)。如何做到这一点 编辑:问题部分解决 只要不使用事务,它就可以工作。当您这样做并且对记录使用混合“模式”时,存在一个问题:C# 如何放弃对所有linq表所做的更改?,c#,database,linq,datacontext,C#,Database,Linq,Datacontext,我想放弃对linq表所做的所有更改(这意味着——我使用linq,数据在客户端更改,服务器上的数据保持不变)。如何做到这一点 编辑:问题部分解决 只要不使用事务,它就可以工作。当您这样做并且对记录使用混合“模式”时,存在一个问题: begin trans insert a record update inserted record commit trans 当您如上所述更新记录时,Linq将其计为已更新的记录,在发生异常的情况下,您有两个操作—回滚事务并丢弃Linq端的数据。在放弃更改时,Li
begin trans
insert a record
update inserted record
commit trans
当您如上所述更新记录时,Linq将其计为已更新的记录,在发生异常的情况下,您有两个操作—回滚事务并丢弃Linq端的数据。在放弃更改时,Linq尝试从数据库中获取更改(放弃更新意味着重新蚀刻记录的数据),但由于所有更改都已回滚,因此没有更新记录
问题
如何以智能的通用方式改进DiscardChanges方法以处理事务。或者如何更改事务/放弃提交更改的工作流以使所有这些工作协同工作
这些都不是明智的解决方案:
只需丢弃当前DataContext而不调用SubmitChanges(),并获取一个新的DataContext 例如:
DataContext myOldDc = new DataContext();
为了补充Johannes所说的,我认为这里的混淆源于将
DataContext
看作类似于DataSet
的东西。事实并非如此
DataContext
中的“表”类似于如何从数据库检索特定类型的数据实体的提示。与数据集
不同,数据上下文
实际上并不“包含”数据,它只是跟踪从中提取的离散实体。如果DataContext
消失(被释放),则实体仍然有效,它们只是被分离。这不同于数据集
,其中单个数据表
和数据行
基本上绑定到它们的容器,并且不能超过它们
为了使用DataContext
的Refresh
方法,您需要在实际实体或实体集合上使用它。不能“刷新”表,因为它实际上不是一个物理表,它只是一种引用
只有在调用SubmitChanges
方法时,才会保留对连接到DataContext
的实体所做的更改。如果您处理了DataContext
,则除非您手动将分离的实体重新附加到新的DataContext
上,否则这些更改绝对无法持久存在。此问题有1个,有2个。让我们从问题开始:a)效率——我必须为新的数据上下文指定连接字符串,这意味着它实际上再次连接到数据库——这不是免费的b)副作用——C#GC不是确定性的,这意味着旧的数据上下文仍然存在,我不确定它对事务和问题会有什么影响:a)我已经将数据上下文传递给了几个助手类,当我更改数据上下文时,我在本地执行,而helper类在执行Submit时,它们提交了我想要删除的数据。除非您通过Reflector验证了这一点,否则不要假设重新提交连接字符串实际上会创建一个新的连接。connstring可以很容易地成为连接池字典的一个键,例如+1:这可能会非常棘手。我曾经在构建一个Linq to Sql应用程序,我心里“知道”这一点,但当我试图在数据输入对话框中创建一个良好的用户体验,允许用户取消更改时,我仍然把自己画进了一个角落。我喜欢LinqtoSQL背后的想法,但我不喜欢执行,部分原因是执行这类任务很困难。