Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
使用不带时间戳的Linq SubmitChanges并同时使用StoredProcess_Linq_Stored Procedures_Timestamp_Datacontext_Submitchanges - Fatal编程技术网

使用不带时间戳的Linq SubmitChanges并同时使用StoredProcess

使用不带时间戳的Linq SubmitChanges并同时使用StoredProcess,linq,stored-procedures,timestamp,datacontext,submitchanges,Linq,Stored Procedures,Timestamp,Datacontext,Submitchanges,我使用的Sql表没有行版本或时间戳。但是,我需要使用Linq来更新表中的某些值。因为Linq不知道要更新哪些值,所以我使用第二个DataContext从数据库检索当前对象,并使用数据库和实际对象作为Attach方法的输入,如下所示: Public Sub SaveCustomer(ByVal cust As Customer) Using dc As New AppDataContext() If (cust.Id > 0) Then Dim

我使用的Sql表没有行版本或时间戳。但是,我需要使用Linq来更新表中的某些值。因为Linq不知道要更新哪些值,所以我使用第二个DataContext从数据库检索当前对象,并使用数据库和实际对象作为Attach方法的输入,如下所示:

Public Sub SaveCustomer(ByVal cust As Customer)
    Using dc As New AppDataContext()
        If (cust.Id > 0) Then
            Dim tempCust As Customer = Nothing

            Using dc2 As New AppDataContext()
                tempCust = dc2.Customers.Single(Function(c) c.Id = cust.Id)
            End Using

            dc.Customers.Attach(cust, tempCust)
        Else
            dc.Customers.InsertOnSubmit(cust)
        End If

        dc.SubmitChanges()
    End Using
End Sub
虽然这确实有效,但我有一个问题:我还使用StoredProcess在特定时间更新客户的某些字段。现在想象一下以下工作流:

  • 从数据库中获取客户
  • 将客户字段设置为新值
  • 使用存储过程更新另一个客户字段
  • 致电SaveCustomer
  • 现在发生的是,SaveCustomer方法从数据库中检索当前对象,该数据库不包含代码中设置的值,但包含存储过程设置的值。当将其与实际对象连接并提交时,它将更新数据库中代码中的值集,并。。。tadaaaa。。。将另一个设置为NULL,因为实际对象不包含存储过程所做的更改

    这可以理解吗


    有没有解决这个问题的最佳实践?

    如果您在ORM背后进行更改,并且不使用并发检查,那么您将遇到问题。您没有显示在步骤“3”中所做的操作,但在我看来,您应该更新对象模型以反映这些更改,也许可以使用
    OUTPUT
    TSQL参数。或坚持面向对象


    当然,在不进行并发检查的情况下执行任何操作都是丢失数据的好方法-因此我首选的选项只是“添加
    行版本”
    。否则,您可能会读取更新的对象并合并内容。。。以某种方式猜测正确的数据是什么…

    如果要断开对象与一个上下文的连接并使用另一个上下文进行更新,则需要保留原始对象,使用行版本,或者在数据库中实现某种哈希例程,并将哈希作为对象的一部分保留。其中,我强烈推荐Rowversion选项。像您试图做的那样,将当前值用作原始值只会引起并发问题

    这听起来很合理。然而,我的工作是针对一个客户的数据库和基础设施,他不会引入RowVersionion,因为他的数据库的大部分是动态生成的,他使用自己的框架来访问它。然而,我正抓住机会与Linq合作,针对唯一的静态表来展示Linq的全部内容。;-)现在,由于SP的原因,我遇到了问题。您是否有一个好的来源,可以让我在此上下文中了解并发检查?问题是-如上所述-我无法添加行版本控制,因为我正在处理客户数据库,并且根本没有修改它的选项:(