1

以下に示すテーブル定義があります。

ライセンス

ClientId
Type
Total
Used

ClientId と Type を組み合わせて行を一意に識別します。以下のようなマッピングファイルがあります。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" lazy="false" table="License">
<id name="ClientId" access="field" column="ClientID" />
<property name="Total" access="field" column="Total"/>
<property name="Used" access="field" column="Used"/>
<property name="Type" access="field" column="Type"/>
  </class>
</hibernate-mapping>

クライアントがライセンスを使用してユーザーを作成した場合、テーブルの [使用済み] 列を更新する必要があります。マッピング xml でこのテーブルの id 列として ClientId 列を設定すると、TooManyRowsAffectedException が発生します。

NHibernate が ClientId と Type に基づいて更新できるように、マッピング レベルで複合キーを設定する方法を教えてください。

次のようなもの: Update License SET Used=Used-1 WHERE ClientId='xxx' AND Type=1

助けてください。

ありがとう、マヘシュ

4

3 に答える 3

3

複合 ID を使用する必要があります

http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-compositeid

于 2010-05-11T16:23:03.723 に答える
2

主キーが複合の場合、マッピングはそれを反映する必要があり、クラスは and をオーバーライドする必要がEqualsありますGetHashCode

また、がエンティティClientIdの主キーである場合は、ID だけでなく としてマップする必要があります。Clientmany-to-many

また、なぜ指定するのlazy="false"ですか?その影響を知っていますか?

また、なぜすべてを でマップするのaccess="field"ですか? プロパティには特別なロジックがありますか?

これは、私が今書いたすべてを考慮して改訂されたマッピングです。該当しない部分は無視してかまいません:-)

<class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" table="License">
  <composite-id>
    <key-many-to-one name="Client" column="ClientID" />
    <key-property name="Type" />
  </composite-id>
  <property name="Total" />
  <property name="Used" />
</class>
于 2010-05-11T16:54:02.120 に答える
1

上記の他の同志のように、composite-id を使用する必要があります。これはベストではありませんが、許容できる方法です。

一方、単純に更新インターセプターを作成し、その中で Type = 1 であることを確認できます。

これを明確に理解するのに役立つトピックに関するリンクを次に示します。

  1. エレガントなコード: NHibernate インターセプターの実装
  2. Hibernate ドキュメント : インターセプター
  3. NHibernate IInterceptor 実装のサンプル
  4. Enterprise .NET Community : NHibernate Part 2 (下にスクロール: Interceptors and Persistent Lifecycle )
  5. NHibernate Interceptor Auditing Inserted Object Id (SO question)

複合キーよりもインターセプターを使用する主な利点は、DBRM を壊さず、モデルをより正確に表すマッピング ファイルを「汚染」することなく、より柔軟なソリューションを提供することです。

于 2010-05-11T17:07:19.973 に答える