使用不带时间戳的Linq SubmitChanges并同时使用StoredProcess
我使用的Sql表没有行版本或时间戳。但是,我需要使用Linq来更新表中的某些值。因为Linq不知道要更新哪些值,所以我使用第二个DataContext从数据库检索当前对象,并使用数据库和实际对象作为Attach方法的输入,如下所示:使用不带时间戳的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
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在特定时间更新客户的某些字段。现在想象一下以下工作流:
有没有解决这个问题的最佳实践?如果您在ORM背后进行更改,并且不使用并发检查,那么您将遇到问题。您没有显示在步骤“3”中所做的操作,但在我看来,您应该更新对象模型以反映这些更改,也许可以使用
OUTPUT
TSQL参数。或坚持面向对象
当然,在不进行并发检查的情况下执行任何操作都是丢失数据的好方法-因此我首选的选项只是“添加
行版本”
。否则,您可能会读取更新的对象并合并内容。。。以某种方式猜测正确的数据是什么…如果要断开对象与一个上下文的连接并使用另一个上下文进行更新,则需要保留原始对象,使用行版本,或者在数据库中实现某种哈希例程,并将哈希作为对象的一部分保留。其中,我强烈推荐Rowversion选项。像您试图做的那样,将当前值用作原始值只会引起并发问题 这听起来很合理。然而,我的工作是针对一个客户的数据库和基础设施,他不会引入RowVersionion,因为他的数据库的大部分是动态生成的,他使用自己的框架来访问它。然而,我正抓住机会与Linq合作,针对唯一的静态表来展示Linq的全部内容。;-)现在,由于SP的原因,我遇到了问题。您是否有一个好的来源,可以让我在此上下文中了解并发检查?问题是-如上所述-我无法添加行版本控制,因为我正在处理客户数据库,并且根本没有修改它的选项:(