Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何放弃对所有linq表所做的更改?_C#_Database_Linq_Datacontext - Fatal编程技术网

C# 如何放弃对所有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

我想放弃对linq表所做的所有更改(这意味着——我使用linq,数据在客户端更改,服务器上的数据保持不变)。如何做到这一点

编辑:问题部分解决

只要不使用事务,它就可以工作。当您这样做并且对记录使用混合“模式”时,存在一个问题:

begin trans
insert a record
update inserted record
commit trans
当您如上所述更新记录时,Linq将其计为已更新的记录,在发生异常的情况下,您有两个操作—回滚事务并丢弃Linq端的数据。在放弃更改时,Linq尝试从数据库中获取更改(放弃更新意味着重新蚀刻记录的数据),但由于所有更改都已回滚,因此没有更新记录

问题 如何以智能的通用方式改进DiscardChanges方法以处理事务。或者如何更改事务/放弃提交更改的工作流以使所有这些工作协同工作

这些都不是明智的解决方案:

  • 重新蚀刻所有数据
  • 重新创建到DB的连接(因为它导致(1))

  • 只需丢弃当前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背后的想法,但我不喜欢执行,部分原因是执行这类任务很困难。