1

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

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

返信の場合はthx

編集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" />

Edit2:NH 2.1.1ではXMLエンティティが機能せず(NH-1236)、NHが「このXMLドキュメントではDTDが禁止されています」をスローするため、受け入れられたソリューションを削除しました

4

5 に答える 5

1

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

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

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

別のオプションがあります: XMLエンティティを使用できます。これは、NHibernateでサポートされているXMLのかなり原始的な機能です。言及されているNHリファレンスドキュメントのこの章をお読みください。

于 2009-11-04T09:00:22.270 に答える
0

特定のケースに合わせて特別なコードジェネレーターを作成することが唯一の選択肢です。

于 2009-11-04T08:58:56.703 に答える
0

オプション1:
-基本クラスでこれらの3つのプロパティを定義する

-エンティティにこのベースから継承させます

-「クラス階層ごとのテーブル」を設定します

オプション2:

-これらの3つのプロパティをコンポーネントとして定義します。

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

于 2009-11-04T09:02:57.023 に答える
0

fluentNHibernateをご覧になると、マッピング作業が簡単になります。自動マッピングを使用すると、これらのプロパティを定義するために必要なのは抽象基本クラスのみです。

于 2009-11-04T14:32:59.523 に答える
0

これを行う唯一の方法は、動的マッピングを使用することであるようです(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のクラスで使用できるようにすると、パフォーマンスへの影響はごくわずかです。

于 2009-11-17T09:33:13.243 に答える