我正在使用没有 rowversion 或时间戳的 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
虽然这确实有效,但我有一个问题:我还在某些时候使用 StoredProcedures 来更新 Customer 的某些字段。现在想象以下工作流程:
- 从数据库中获取客户
- 将客户字段设置为新值
- 使用存储过程更新另一个客户字段
- 调用 SaveCustomer
现在发生的情况是,SaveCustomer 方法从数据库中检索当前对象,该对象不包含代码中设置的值,但包含存储过程设置的值。当将它与实际对象附加然后提交时,它将更新数据库中代码中设置的值,并且... tadaaaa... 将另一个设置为 NULL,因为实际对象不包含由存储过程。
这可以理解吗?
有没有解决这个问题的最佳实践?