8

というエンティティ オブジェクトがあり、このエンティティには というタイプPatientのプロパティがあります。VisitsVisitsCollection

VisitsCollectionsの子クラスですIList<Visit>が、コレクションにいくつかのカスタム ロジックも追加します (自動順序付け、検証、通知など)。

コレクションに追加されたエンティティにいくつかのデータを追加し、他のいくつかの事務処理を透過的に実行するため、カスタム コレクション タイプを使用する必要があります。

今、NHibernate でそれをマップしたいので、以下を作成しました:

<list name="Visits" lazy="true" fetch="select">
    <key foreign-key="PatientId" />
    <index column="Timestamp" />
    <one-to-many class="Visit" not-found="ignore"/>
</list>

私は例外を取得しています:

タイプ「NHibernate.Collection.PersistentList」のオブジェクトをタイプ「...VisitsCollection」にキャストできません

訪問プロパティにアクセスしているときはいつでも。

私もこのようにマッピングしようとしました:

<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection">
    <key foreign-key="PatientId" />
    <index column="Timestamp" />
    <one-to-many class="Visit" not-found="ignore"/>
</list>

それでも、私はこの例外を受けています:

カスタム タイプは UserCollectionType を実装していません: .....VisitsCollection

VisitsCollectionコレクションクラスはフレームワークの一部であるため、NHibernate 型から継承したくありません(データベースだけでなく、多くのシナリオで使用されるため)。

これをマップしてコードの構造を維持する方法についてのアイデアはありますか?

前もって感謝します。

4

3 に答える 3

7

私は怠け者なので、カスタム コレクション型を使用することはありません。NHibernate は、私が信じている IUserCollectionType を使用することを望んでいますが、これには少し配管が必要です。

それよりも、 Billly McCafferty で説明されているように、拡張メソッドの使用を検討することから始めます。しかし、コードが書かれているので...

または、ここで Colin Jack が説明したように、コレクションをコンポーネントとしてマップすることもできます。これはあなたのシナリオにとってより簡単でしょうか?

このSO スレッドも確認してください。

于 2010-03-03T17:52:14.493 に答える
1

また、カスタムコレクションを使用しないように投票します。とにかく、あなたはコンポーネントを介してそれを行うことができます。

<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core">
<set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" >
  <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" />
  <!--This is used to set the type of the collection items-->
  <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/>
</set>

NHibernateカスタムコレクションをfluentNHibernateにマッピングする方法は?

于 2010-07-16T09:03:41.910 に答える