2010-05-17 56 views
1

我有以下實體映射「值對象」集合中(流利)NHibernate的

public class Employee 
{ 
    public virtual int Id {get;set;} 
    public virtual ISet<Hour> XboxBreakHours{get;set} 
    public virtual ISet<Hour> CoffeeBreakHours {get;set} 
} 

public class Hour 
{ 
    public DateTime Time {get;set;} 
} 

(我想在這裏做的是存儲信息僱員扮演的Xbox每天讓我們在9:00 13說: 30,並且每天在7:00 12:30 18:00有個休息時間) - 我不確定我的方法在這裏是否有效。

問題是我的(理想流利)映射應該如何在這裏? Hour類沒有必要(從我的角度來看)具有Id或可以從某種存儲庫訪問。

+0

分析完這個問題之後,我接近了一個結論:Hour對象需要是一個帶有Id的實體... – adrin 2010-05-17 17:14:06

回答

5

根據您的操作方式,您需要將您的集合映射爲元素映射或作爲組件集合(即NHibernate中的<element><composite-element>)。前者需要定義一個IUserType,而後者則適用於如果您要讓您的類擁有多個屬性的情況。

如果你堅持使用一個屬性,你需要定義一個IUserType,這樣NHibernate才能知道如何將你的類型翻譯成數據庫。一旦你做到了這一點,你可以像這樣用流利的NHibernate映射它:

HasMany(x => x.XboxBreakHours) 
    .Element("value", x => x.CustomType<YourUserType>); 

,指定你的集合存儲在一個列的表稱爲value包含的實際值。 CustomType調用告訴NHibernate使用IUserType這個集合。

如果您要在Hour類中有多個屬性,則需要執行以下操作(注意:這實際上與執行Component映射非常相似)。

HasMany(x => x.XboxBreakHours) 
    .Component(comp => 
    { 
    comp.Map(x => x.Time); 
    comp.Map(x => x.Another); 
    });