8

次のソリューション プロジェクト構造があります。

アプリケーション.コア.エンティティ

Application.Xtend.CustomerName.Entities

コア プロジェクトでは、エンティティCustomer defiend があります。XTend プロジェクトでは、xCustomer という名前の Customer をサブクラス化するエンティティを定義しています(現時点ではより適切な名前がないため...)。

ここでの考え方は、アプリケーションにコア ドメイン モデルがあるということです。その後、顧客はコア モデルの拡張機能を含む新しいアセンブリを作成できます。拡張アセンブリが存在する場合、スマートIRepositoryクラスは代わりにコア クラスのサブクラスを返します。

この関係をNHibernateにマッピングしようとしています。Fluent NHibernateを使用して、次のマッピングを生成できました。

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   default-lazy="false"
                   assembly="NHibernate.Core.Entites"
                   namespace="NHibernate.Entites"
                   default-access="field.camelcase-underscore">
  <!-- Customer is located in assembly Application.Core.Entities -->
  <class name="Customer" table="Customers" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="Id" type="Int64">
      <generator class="native" />
    </id>
    <component name="Name" insert="true" update="true">
      <property name="LastName" column="LastName" length="255" type="String" not-null="true">
        <column name="LastName" />
      </property>
      <property name="FirstName" column="FirstName" length="255" type="String" not-null="true">
        <column name="FirstName" />
      </property>
    </component>
    <!-- xCustomer is located in assembly Application.XTend.CustomerName.Entities -->
    <joined-subclass name="xCustomer" table="xCustomer">
      <key column="CustomerId" />
      <property name="CustomerType" column="CustomerType" length="255" type="String" not-null="true">
        <column name="CustomerType" />
      </property>
    </joined-subclass>
  </class>
</hibernate-mapping>

ただし、NHib は次のエラーをスローします。

NHibernate.MappingException: 永続クラス Application.Entites.xCustomer、Application.Core.Entites が見つかりません ---> System.TypeLoadException: アセンブリ 'Application.Core.Entites、Version=1.0 から型 'Application.Entites.xCustomer' を読み込めませんでした.0.0、カルチャ = ニュートラル、PublicKeyToken = null'..

xCustomer が Core ライブラリで定義されていないのは理にかなっています。

このように異なるアセンブリにまたがることは可能ですか? 私は問題に間違ってアプローチしていますか?

4

2 に答える 2

7

NHibernate Users メーリング リストでこれと同じ質問をしたところ、解決策があまりにも明白だったので、それを見ることができず、少し恥ずかしくなりました。

hibernate-mapping 属性のアセンブリと名前空間は便利なショートカットであり、クラス名を完全修飾する必要はありません。これにより、適切なマークアップを使用できますが、クラス要素と結合サブクラス要素の両方の name 属性も完全修飾アセンブリ名を取ることができます。

したがって、上記の壊れたマッピング ファイルは次のように修正できます。

<joined-subclass name="Application.XTend.CustomerName.Entities.xCustomer, 
                 Application.XTend.CustomerName.Entities, Version=1.0.0.0, 
                 Culture=neutral, PublicKeyToken=null" 
                 table="xCustomer">
  <key column="CustomerId" />
  <property name="CustomerType" column="CustomerType" length="255" 
            type="String" not-null="true">
    <column name="CustomerType" />
  </property>
</joined-subclass>

これは私が期待したとおりに機能します。そこで、Fluent-NHibernate のソースを調べて、問題を解決するための作業用単体テストを含むパッチを作成し、プロジェクトに提出しました

@David Kempを助けてくれてありがとう

于 2008-11-04T16:45:12.580 に答える
3

extends要素の属性を使用してマップする必要があります<class>(AFAIK、これはNHibernate 2.0の新機能です)。次に、サブクラス マッピング ( .hbm.xml) を XTend アセンブリに含めることができます。

Fluent NHibernate を使用してこれを行うには、AddAttribute/AddProperty (それが何と呼ばれるか思い出せません) を使用する必要がある場合があります。(またはパッチを提出してください)。

于 2008-11-04T13:04:30.063 に答える