0

私は現在、バージョン フィールドを持つエンティティのマッピングを作成することに興味があります。ただし、Web 環境でバージョン管理を行う方法については混乱しています。ほとんどの例で、エンティティが using ステートメント内で即座に更新されるのを見てきました。

Web の例では、エンティティは HTTP GET でフェッチされ、クライアントが HTTP POST を呼び出すまで更新されません。投稿で通常行うことは、エンティティを再度フェッチし、データを更新して保存することです。しかし、そのエンティティは、GET と POST の間に変更された可能性があります。保存する前に自分でバージョン フィールドを確認する必要がありますか、それとももっと良い方法がありますか?

4

2 に答える 2

2

バージョン 1) 手動でチェックするか、2) NHibernate に組み込まれているバージョニング機能と DB のタイムスタンプ タイプに依存します。(SQL Serverはそれをサポートしていますが、おそらく他のDBも何らかの形でサポートしています)。2 番目のケースでは、 を処理する必要がありexceptionます。

NHibernate http://ayende.com/blog/3946/nhibernate-mapping-concurrencyで同時実行を処理する方法の詳細な説明があります。

SQL Server を使用している場合は、列を作成できます

CREATE TABLE [dbo].[MyTable](
 ...
 [Version] [rowversion] NOT NULL -- new keyword for deprecated [timestamp]
 ...

次に、バージョン マッピングを調整します。

<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
  <column name="Version" not-null="false" sql-type="timestamp" />
</version>

また、バージョン番号をクライアントに渡し、POST でもバインドする必要があります (例: base64)

session.Update(entity)DB でより古い Version 値を持つを試みるたびに、NHibernate は をスローしNHibernate.StaleObjectStateExceptionます。そして、この場合にのみ、あなたはそれを扱うことができます。バージョンが一致する場合、すべてが正しく機能し、UPDATE ステートメントは成功します。

于 2012-11-27T11:50:40.040 に答える
2

はい、これは自分で確認する必要があると思います。これを行う 1 つの方法は、最初の get でエンティティを取得し、それを呼び出し元に送り返すときに、応答にバージョン番号を含めることです。投稿するときは、バージョン番号を含めてください。サーバー側では、添付された nHibernate エンティティを再読み込みするときに、そこから現在のバージョン番号を取得します。バージョン番号が古い場合は、更新を停止してください。

于 2012-11-27T09:38:15.757 に答える