行バージョンまたはタイムスタンプなしで SQL テーブルを使用しています。ただし、テーブル内の特定の値を更新するには、Linq を使用する必要があります。Linq は更新する値を認識できないため、2 番目の 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 に設定されます。ストアド プロシージャ。
それは理解できましたか?
この問題を解決するためのベスト プラクティスはありますか?