1

rowversionやタイムスタンプのないSQLテーブルを使用しています。しかし、Linqを使用してテーブルの特定の値を更新する必要があります。これがしますがTimeStampとStoredProceduresを使用しないLinq SubmitChangesを同時に使用する

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 

:LINQの更新する値を知ることができないので、私は、データベースから現在のオブジェクトを取得し、そのようなメソッドを取り付けのための入力として、データベースと実際のオブジェクトの両方を使用するために第2のDataContextを使用しています私は問題があります:私はまた、StoredProceduresを使用して、特定の時間に顧客のいくつかのフィールドを更新しています。今、次のワークフローを想像:

  1. データベース
  2. から顧客が
  3. 新しい値に顧客フィールドを設定しなさい
  4. コールSaveCustomer

別の顧客のフィールドを更新するストアドプロシージャを使用しますSaveCustomerメソッドは、コードに設定された値は含まれていませんが、ストアドプロシージャによって設定された値が格納されているデータベースから現在のオブジェクトを取得するようになりました。これを実際のオブジェクトに貼り付けて送信すると、データベース内のコードにも設定された値が更新され、... tadaaaa ...他のオブジェクトをNULLに設定します。実際のオブジェクトには、ストアドプロシージャ。

わかりましたか?

この問題を解決するためのベストプラクティスはありますか?

答えて

0

ORMの後ろに変更を加え、並行性チェックを使用しない場合は、問題が発生します。ステップ3で行ったことは表示しませんが、おそらくOUTPUT TSQLパラメータを使用して、これらの変更を反映するようにオブジェクトモデルを更新する必要があります。または、オブジェクト指向に固執する。同時実行チェックせずにをやっもちろん

は、データを失うための良い方法である - ので、私のは単に「rowversionを追加」されオプションを好みました。そうでなければ、更新されたオブジェクトを読み込んでマージすることができます。何らかの正しいデータが何であるかを推測することができます。

+0

これは間違いなく妥当と思われます。しかし、私は顧客のデータベースとインフラストラクチャに反対しており、彼のデータベースのほとんどの部分が動的に生成され、独自のフレームワークを使用してアクセスするという事実により、ローバージョンニングを導入しません。 しかし、私はLinqと一緒に働いているチャンスを、Linqのことを示すために静的なテーブルだけに対して取り上げていました。 ;-)今私はSPのために問題を抱えています。このコンテキストで並行性チェックについて学ぶことができる良い出典がありますか? – Mephisztoe

0

オブジェクトをあるコンテキストから切断し、元のオブジェクトを保持するか、行バージョンを使用するか、データベースにハッシングルーチンを実装し、ハッシュをオブジェクトの一部として保持する必要があります。これらのうち、Rowversionオプションも強くお勧めします。あなたがしようとしているように、現在の値を元の値として使うのは、並行性の問題だけを求めることです。

+0

問題は - 上記のように - 私は顧客データベースに対して作業しており、単に変更するオプションがないので、私はrowversioningを追加できません。 :( – Mephisztoe

関連する問題