質問

エンティティにいくつかの標準プロパティを追加したいというシナリオがあります。つまり、たとえば、1 つの int プロパティと 2 つの string プロパティが関連するすべてのエンティティに適用されます。100 を超えるマッピング ファイルがあり、すべてではありませんが、ほとんどがこれらの新しいプロパティのホストになります。クラス内でこれを定義するのは簡単です。ただし、マッピングでは、ユーティリティまたはxsltを作成してそれを適用すること以外の参考情報は見つかりませんでした(Hibernate マッピングで再利用可能な <generator> 要素を定義する方法).

ただし、この「標準」マッピングからプロパティを追加/変更/削除できるようにしたいと考えています。

返信はありますか

編集1:追加したいマッピングの例

<property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
<many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />

編集2:NH 2.1.1 では XML エンティティが機能せず (NH-1236)、NH が「この XML ドキュメントでは DTD は禁止されています」というメッセージをスローするため、承認された解決策を削除しました。

役に立ちましたか?

解決 5

これを行う唯一の方法は、動的マッピングを使用することのようです(http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx)

そのため、エンティティが新しいプロパティ (IAuditable としましょう) に使用するインターフェイスをすでに定義しているので、NH セッションの初期化時に適切なコードを実行するだけです。

Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
foreach (var persistentClass in mappings.Classes) 
{ 
   if (persistentClass.MappedClass is IAuditable)
   {
     ...
   }
}

その後

cfg.BuildSessionFactory();

約85クラスに使用する準備ができているためには、パフォーマンスの影響は無視できます

他のヒント

それは、これらのプロパティがクラスにどのように実装されるかによって異なります。

それらがすべて定義されている場合、 基本クラスまたはインターフェイス, 、基本クラスまたはインターフェイスで一度マップし、次を使用して派生できます。 union-subclass. 。いくつかの制限があります。読む NHibernate ドキュメントのこの章 それについて。

それらを 1 つのクラスにまとめる場合は、それらを 1 つのクラスとしてマッピングできます。 ユーザータイプ. 。これはコンポーネントに似ていますが、ユーザー タイプでタイプ名、長さなどを指定できます。各列名を指定する必要があります。

別のオプションもあります。あなたは使うことができます XMLエンティティ. 。これは、NHibernate によってサポートされる XML のかなり原始的な機能です。読む NH リファレンス ドキュメントのこの章 それが言及されている場所。

あなたの特定のケースのための特別なコードジェネレータを作成すると、あなたの唯一のオプションです。

オプション1:
基本クラスでは、これら3つのプロパティを-define

あなたのエンティティが、このベースから継承-have

-setアップ 'テーブルクラス階層ごとに'

オプション2:

-define成分として、これら3つのプロパティを

- あなたが再利用された1つのファイルにこれらの3つのプロパティのマッピングを持つことができます。

あなたは fluentNHibernate のを見てかかることがあり、それはあなたのためのマッピング作業を簡素化します。自動マッピングではとあなただけのこれらのプロパティを定義する抽象基底クラスが必要な場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top