2012-03-14 15 views
0

Personオブジェクトをマップしたいと思います。2つの1対多の関係をNHibernateの1つのコレクションにマッピングする

私はPersonId,FatherIdMotherIdフィールドなどのフィールドを持つPeopleテーブルを持っています。 2つの最後の参照PersonIdは非常に同じテーブルにあります。私のドメインモデルで

私は親のPersonIdへのFatherIdまたはMotherIdを設定した他のすべてのPersonChildren読み取り専用のコレクションを持っているしたいと思います。そうする

一つの方法は、FathersChildrenMothersChildrenコレクションにそれぞれFatherIdMotherId外部キーを使用して、親の性別に応じて、Childrenゲッターでそれらのいずれかを返す2 HasManyとマップを使用することです。しかし、それは私のドメインオブジェクトをちょうど醜いものにしてしまいます。

これを解決する方法はありますか。私は流暢または息子のいずれかに満足しています。

+0

ちょっとしたアイデア:IGetter/ISetterの実装を使ってリストを連結したり、性別に応じてリストを設定したりして、FatchersChildrenとMothersChildrenを仮想プロパティとしてマップすることができます。これはあなたが必要とするいくつかの余分なコードです – Firo

答えて

0

まあ、私は私のモデルを見ていたし、それは、遅延ロードを許可するようにvirtualするすべてのプロパティを必要とNHibernateのことを私のところに来ました。元のクラスから継承したクラスを持つオブジェクトを返します。だから私は同じことをしました。わずか派生クラス用に変更

public class PersonEntity : Person 
{ 
    public virtual IList<Person> FatherChildren { get; set; } 
    public virtual IList<Person> MotherChildren { get; set; } 

    public override IEnumerable<Person> Children 
    { 
     get 
     { 
      return Gender == Domain.Gender.Male ? FatherChildren : MotherChildren; 
     } 
    } 
} 

とマッピング:マッピングのための

public class Person 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual Gender Gender { get; set; } 
    public virtual IEnumerable<Person> Children { get; set; } 
} 

Entityクラス:

私のドメインモデルは同じまま今

public class PersonMap : ClassMap<PersonEntity> 
{ 
    public PersonMap() 
    { 
     Table("People"); 

     Id(x => x.Id) 
      .GeneratedBy.Guid(); 

     HasMany<PersonEntity>(x => x.FatherChildren) 
      .KeyColumn("FatherId") 
      .Inverse() 
      .ReadOnly(); 

     HasMany<PersonEntity>(x => x.MotherChildren) 
      .KeyColumn("MotherId") 
      .Inverse() 
      .ReadOnly(); 

     Map(x => x.Gender); 
    } 
} 

Iクリーンなモデルを持っている!

関連する問題