2010-11-22 76 views
0

我有幾個類,並希望正確地將它們映射到數據庫:功能NHibernate組件一個一對多

public class AMap : ClassMap<A> 
{ 
    public A() { 
     Id(x => x.Id); 
     Component(x => x.Component, 
        c => c.HasMany(x => x.Elements).Inverse().Cascade.All()); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public B() { 
     Id(x => x.Id); 
     Map(x => x.Time); 
    } 
} 

當我:

public class A 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual ComponentClass Component { get; set; } 
} 

public class ComponentClass 
{ 
    public virtual IList<B> Elements { get;set; } 
} 

public class B 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual DateTime Time { get; set; } 
} 

我他們用流利的映射像地圖保存我的實體,我有類A映射到一個表和B到另一個預期。 但我在Component_id列中有空值。 你能告訴我我在這裏錯過了什麼嗎?

+0

好吧,我解決了我的問題 - 我可以使用我的「父」類的ID。因此組件映射將變爲:c.HasMany(x => x.Elements).Cascade.All()。Column(「Id」); – coding4beer 2010-11-22 23:23:46

回答

1

我相信組件應該在同一個表中,如Ayende's blog post中清楚地指出的那樣,因爲它們僅用於使數據更好地表示爲對象模型。一定要通讀他的博客,它可能是最好的nHibernate資源之一。

+0

感謝您的回覆。我的讀者已經有他的博客:)。 – coding4beer 2010-11-22 23:22:17

1

好吧,我解決了我的問題 - 我可以使用我的「父」類的Id。因此,組件映射將變爲:

public class AMap : ClassMap<A> 
{ 
    public A() { 
     Id(x => x.Id); 
     Component(x => x.Component, 
        c => c.HasMany(x => x.Elements).Cascade.All().Column("Id")); 
    } 
} 

這麼明顯,我現在看它......但花了我一個小時。 (即沒有0​​包裝按問題)

+0

這隻會給你一個一對一的關係,因爲你通過相同的Id值顯式地將組件映射到它的父項,即`Parent.1 => Component.1,Parent.2 => Component.2` – ChrisAnnODell 2010-11-22 23:41:17

1

如果你有一個一對多的關聯直接到組件的集合,那麼你可以直接映射它:

HasMany(x => x.Elements) 
    .AsSet() 
    .Table("ElementTable") 
    .KeyColumn("KeyColumn") 
    .Cascade.All() 
    .Component(x => 
    { 
     x.Map(c => c.Id); 
     x.Map(c => c.Time); 
    }) 
    .LazyLoad();