在(Fluent)NHibernate中映射'value object'集合

时间:2010-05-17 16:01:51

标签: nhibernate fluent-nhibernate domain-driven-design

我有以下实体

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;}
}

(我想在这里做的是员工A每天播放Xbox的商店信息,比如9:00 13:30,每天7:00 12:30 18:00喝咖啡休息时间) - 我不确定如果我的方法在这里完全有效。

问题是我的(理想上流畅的)映射应该如何?对于Hour类来说,没有必要(从我的角度来看)具有Id或可以从某种存储库访问。

1 个答案:

答案 0 :(得分:5)

根据您的想法,您需要将集合映射为元素映射或组件集合(在NHibernate术语中为<element><composite-element>)。前者需要IUserType定义,后者则需要Hour类有多个属性。

如果您坚持使用单个属性,则需要定义IUserType,以便NHibernate知道如何从您的类型转换为数据库。完成后,您可以将其映射到Fluent 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);
  });