2012-01-23 10 views
0

、私は次の階層的なエンティティにマッピングしようとしています:このClassMappingで階層エンティティの親キー

public class BusinessType 
{ 
    public virtual Guid BusinessTypeId { get; set; } 
    public virtual Guid? ParentBusinessTypeId { get; set; } 
    public virtual String BusinessTypeName { get; set; } 
    public virtual ICollection<BusinessType> Children { get; set; } 
} 

を:

public class BusinessTypeMapper : ClassMapping<BusinessType> 
{ 
    public BusinessTypeMapper() 
    { 
     Id(x => x.BusinessTypeId, x => x.Type(new GuidType())); 
     Property(x => x.ParentBusinessTypeId, x => x.Type(new GuidType())); 
     Property(x => x.BusinessTypeName); 
     Set(x => x.Children, 
      cm => 
       { 
        // This works, but there is an ugly string in here 
        cm.Key(y => y.Column("ParentBusinessTypeId")); 
        cm.Inverse(true); 
        cm.OrderBy(bt => bt.BusinessTypeName); 
        cm.Lazy(CollectionLazy.NoLazy); 
       }, 
      m => m.OneToMany()); 
    } 
} 

これは正常に動作しますが、私リファクタリングが機能するようにラムダを使ってリレーションのキーを指定することができます。これは以下のように、利用可能であるように思わ:

public class BusinessTypeMapper : ClassMapping<BusinessType> 
{ 
    public BusinessTypeMapper() 
    { 
     Id(x => x.BusinessTypeId, x => x.Type(new GuidType())); 
     Property(x => x.ParentBusinessTypeId, x => x.Type(new GuidType())); 
     Property(x => x.BusinessTypeName); 
     Set(x => x.Children, 
      cm => 
       { 
        // This compiles and runs, but generates some other column 
        cm.Key(y => y.PropertyRef(bt => bt.ParentBusinessTypeId)); 
        cm.Inverse(true); 
        cm.OrderBy(bt => bt.BusinessTypeName); 
        cm.Lazy(CollectionLazy.NoLazy); 
       }, 
      m => m.OneToMany()); 
    } 
} 

問題は、これが既に設定さParentBusinessTypeIdを無視して、businesstype_keyという列を生成するためにNHibernateのを引き起こすことがあります。 NHibernateに文字列ではなくリレーションを指定するラムダを使用させる方法はありますか?

+0

'public virtual BusinessType Parent {get;セット; } '? – Firo

+0

それは私の質問の問題を解決するのに役立ちますか?私は子供から親に移動する必要はありません。親から子供まで、私は必要とは考えていませんでした。 –

答えて

1

その後、completly public virtual Guid? ParentBusinessTypeId { get; set; }を削除私は両親の子供たちへ から、親に子供から移動する必要はありませんので、私は

ことが必要であると考えていませんでした。 NHは "businesstype_key"(convention)のみを作成し、 "ParentBusinessTypeId"は作成しません。それを変更したい場合は、あなたの好みのカラム名をcm.Key(y => y.Column("yourpreferredColumnName"));と指定する必要があります。

+0

OK、私はそれを買うことができます。ただし、他のすべての列にプロパティ名を使用するため、実際には一貫性のないスキーマが作成されるため、愚かなコンベンションになります。好奇心のために、私がParentプロパティをマップすると、私の元々の望みの結果が可能になりますか?また、PropertyRefは何を目的としていますか? –

+0

"私は親のプロパティをマップする" - >おそらくいいえ、大会は同じと思います。 "PropertyRef" - >は、外部キーがPrimaryKeyを参照していないが、別のプロパティを参照している場合に使用されます。 'clientname - > client.name'の代わりに' client_id - > client.id' – Firo

+0

非常に参考になりました@Firo! –