2

永続化するために集約に追加された ID が割り当てられたエンティティ「グループ」があります。NHibernate はそれが新規か既存かを判別できないため、これは問題を引き起こします。この問題を解決するために、マッピングを変更して、グループ エンティティが SQL タイムスタンプ バージョン列で楽観的ロックを使用するようにしました。これにより、新しい問題が発生しました。グループにはサブ オブジェクトのバッグがあります。そのため、NHibernate が新しいグループをデータベースにフラッシュするとき、最初に Groups テーブルに Group レコードを作成し、次に各サブオブジェクトを挿入してから、Group レコードを更新してタイムスタンプ値を更新します。ただし、マッピングが dynamic-update="true" および optimistic-lock="version" の両方である場合、更新を完了するために生成される sql は無効です。

マッピングは次のとおりです。

<class xmlns="urn:nhibernate-mapping-2.2" dynamic-update="true" mutable="true" optimistic-lock="version" name="Group" table="Groups">
    <id name="GroupNumber" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="GroupNumber" length="5" />
      <generator class="assigned" />
    </id>
    <version generated="always" name="Timestamp" type="BinaryBlob" unsaved-value="null">
      <column name="TS" not-null="false" sql-type="timestamp" />
    </version>
    <property name="UID" update="false" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="GroupUID" unique="true" />
    </property>
    <property name="Description" type="AnsiString">
      <column name="GroupDescription" length="25" not-null="true" />
    </property>
    <bag access="field.camelcase-underscore" cascade="all" inverse="true" lazy="true" name="Assignments" mutable="true" order-by="GroupAssignAssignment">
      <key foreign-key="fk_Group_Assignments">
        <column name="GroupNumber" />
      </key>
      <one-to-many class="Assignment" />
    </bag>
    <many-to-one class="Aggregate" name="Aggregate">
      <column name="GroupParentID" not-null="true" />
    </many-to-one>
  </class>
</hibernate-mapping> 

マッピングに動的更新と楽観的ロックの両方が含まれている場合、生成される SQL は次のとおりです。

UPDATE groups SET WHERE GroupNumber = 11111 AND TS=0x00000007877

SET ステートメントがないため、これは明らかに無効です。動的更新部分を削除すると、代わりにこの更新ステートメント中にすべてが更新されます。これにより、ステートメントは有効になりますが、不要になります。

誰もこの問題を見たことがありますか? 何か不足していますか?

ありがとう、スティーブ

4

2 に答える 2

1

私はまったく同じ問題を抱えていましたが、最終的にドキュメントが機能するようになるまでに、ドキュメントを見つけ出すのに1年かかりました。bag要素のoptimistic-lock属性をfalseに設定する必要があります。これにより、更新可能なプロパティが変更されていない場合に、NHが親に更新のマークを付けるのを停止します。これがあなたのために働くことを願っています。

于 2010-12-02T16:08:08.637 に答える
0

id 要素に unsaved-value 属性を設定してみてください。これにより、NHibernate が新しいレコードと既存のレコードを区別し、タイムスタンプの問題を回避できるようになります。

<id name="GroupNumber" unsaved-value="" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

ドキュメントは、これがデフォルトで空の文字列になるべきだと私に信じさせますが、試してみる価値があります。

于 2010-04-07T16:50:32.853 に答える