5

エンティティ フレームワークで、ストアド プロシージャを使用して、オプティミスティック コンカレンシーを使用してテーブルの更新を実行したいと考えています。既存の更新ストアド プロシージャを変更しないと、これを機能させることができませんでした。行が更新されないときに同時実行例外が発生するように、既存のストアド プロシージャをマップできる方法があるかどうかを判断しようとしています。

背景情報:

  • 更新ストアド プロシージャ (タイムスタンプを含む) 列を .edmx ファイルにマップしました
  • 私の既存のストアド プロシージャは次のようになります (実際のテーブル名と列は明らかに省略されています)。

    UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
    WHERE PK = @PK AND Timestamp = @Timestamp
    
    SELECT PK, Column1, Column2, ....., Timestamp
    FROM Table WHERE PK = @PK
    
  • (タイムスタンプの不一致が原因で) 更新が失敗した場合でも、ストアド プロシージャの選択部分は行を返します。

ストアド プロシージャを次のように変更すると、次のようになります。

   UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
   WHERE PK = @PK AND Timestamp = @Timestamp

   IF @@ROWCOUNT > 0
       SELECT PK, Column1, Column2, ....., Timestamp
       FROM Table WHERE PK = @PK

その後、すべてが期待どおりに機能し、同時実行エラーが発生します。

または、ストアド プロシージャが出力パラメーターを返すようにし、その出力パラメーターを Entity Framework の .edmx ファイルの "Rows Affected Parameter" にマップすると、同時実行エラーも期待どおりに機能します。

このソリューション(つまり、出力パラメーターを使用)は、ここで最もよく説明されています 。手続き/

ただし、上記の手順はいずれも必要ではないように思われます。Entity Framework は、更新された行数を使用して同時実行例外を発生させるかどうかを判断できると想定しているためです。これらのまったく同じストアド プロシージャ (オプティミスティック コンカレンシーを使用) を ADO.NET DataSet で問題なく使用しました。私の質問は、既存のストアド プロシージャを変更せずに使用して、Entity Framework でオプティミスティック コンカレンシーを有効にする方法を教えてください。

4

2 に答える 2

-1

ストアド プロシージャのコードを本当に変更したくない場合は、ストアド プロシージャから返されたタイムスタンプと渡されたタイムスタンプを比較できます。異なる場合は、同時実行エラーがあります。

于 2013-10-17T21:50:22.243 に答える