2011-02-04 9 views
4

すでにオンポイントの回答がありましたが、私はそれを見つけられませんでした。私はNH3を使用していますが、クラスを持つエンティティにセットを追加したい特定のインタフェースを実装するユースケースがあります。私は設定ビルダークラスを持っているので、セッションファクトリを作成する前にこれらの変更を行うことができます。実行時にNHibernateクラスを拡張/変更する

public class Person : IHasExtraItems 
{ 
    public Person() 
    { 
     this.ExtraItems = new HashSet<ExtraItem>(); 
    } 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime Birthdate { get; set; } 
    public virtual ICollection<ExtraItem> ExtraItems { get; protected set; } 
} 

public class ExtraItem 
{ 
    public virtual Guid Id { get; set; } 
} 

そして、この例のマッピング:この減少した例を考えると

<class name="Person"> 
    <id name="Id"> 
     <generator class="guid"/> 
    </id> 
    <property name="Name"/> 
    <property name="Birthdate"/> 
    <set name="Extra" table="PersonExtraItems" cascade="all"> 
     <key column="PersonId"/> 
     <many-to-many column="ExtraItemId" class="ExtraItem" unique="true" /> 
    </set> 
    </class> 

私は透過的に多くのクラスにこの機能を適用できるようにしたいので

- ちょうどインタフェースを実装すること - - 私はマッピングに "ExtraItem"を置いてはいけません。代わりに、私は実行時にそれを追加したい。したがって、XMLマッピングからプロパティを削除した場合、これを実行時にどのように追加できますか? http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

をしかし、それは多くのセットに多くをマッピングしていない、と私の弱々しい脳は、メモリ内を解読することができなかった。そこで私が作るしようとしているこの変化の記述を正確にタイプだ

マッピングの表現nhibernateはエフェクトを作成するために使います。キーは、しかし、XMLマッピングされたバージョンの作品nullであるため、これは、デバッガに表示プロパティがテストで

foreach (var cls in cfg.ClassMappings) 
{ 
    if (typeof(IHasExtraItems).IsAssignableFrom(cls.MappedClass)) 
    { 
     NHibernate.Mapping.Property property = new NHibernate.Mapping.Property(); 
     NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls); 
     value.Role = cls.EntityName + ".ExtraItems"; 
     value.IsGeneric = true; 
     var table = new Table(); 
     table.Name = cls.MappedClass.Name + "ExtraItems"; 
     value.CollectionTable = table; 
     value.GenericArguments = new Type[] { typeof(ExtraItem) }; 
     value.IsOptimisticLocked = true; 
     value.IsLazy = true; 
     mappings.AddCollection(value); 
     property.Value = value; 

     property.Name = "ExtraItems"; 
     property.PersistentClass = cls; 
     property.Cascade = "all"; 
     cls.AddProperty(property); 
    } 
} 

に一致するように取得しようとに基づいて、私が来ている最も近い、これはランタイムエラーが発生し、私が変更を行っている時には、ほぼ同じであるように見えます。

ボーナスポイント:私は多面的にテーブルが必要なので、特に多対多が必要です。これにより、パフォーマンスのために真の外部キーを持つ拡張データにエンティティをマップできます。 ExtraItemsは実際には真のエンティティではなく、値型でなければなりませんが、XMLでもそのマッピング方法を理解できませんでした。

ボーナスポイント、パート2:私はconforMでこれを行うことができますか?既存のすべてのマッピングをconforMに切り替える必要はなく、conforMと従来のXMLマッピングを混在させた例は見つからず、既存のマッピングを変更することはありませんでした。 Fluentは別の選択肢かもしれませんが、私はNH3を使用しています。私はFluentがそれをまだサポートしていないと思います。

ありがとうございます!

EDIT私の問題は、私がセットの要素を定義していないということです。しかし、私はセットの要素を適切に定義する方法を見分けることはできません。

答えて

1

NH3には流暢なビルドがありますので、あなたはそれを使うことができます(私はそうです)。流暢に使っているのなら、これを大変簡単に行うことができます。あなたはあなたのボーナスポイントのセクションでそれを言います、だから多分あなたは別の一見を与える必要がありますか?

関連する問題