2010-05-17 100 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); 
    });