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

adr*_*rin 1 nhibernate domain-driven-design fluent-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;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*ory 5

根据你想如何做到这一点,您可能需要您的集合映射为一个元素映射或作为一个组件集合(这是<element><composite-element>在NHibernate的术语).前者需要一个IUserType定义,而后者则需要一个,如果你要让你的Hour班级有一个以上的财产.

如果您坚持使用单个属性,则需要定义一个IUserTypeNHibernate,知道如何将类型转换为数据库.完成后,您可以使用Fluent NHibernate进行映射,如下所示:

HasMany(x => x.XboxBreakHours)
  .Element("value", x => x.CustomType<YourUserType>);
Run Code Online (Sandbox Code Playgroud)

这指定您的集合存储在一个表中,该表包含一个value包含实际值的列.该CustomType调用是告诉NHibernate使用IUserTypefor this collection的.

如果您的Hour类中有多个属性,则需要执行以下操作(注意:这实际上与执行Component映射非常相似).

HasMany(x => x.XboxBreakHours)
  .Component(comp =>
  {
    comp.Map(x => x.Time);
    comp.Map(x => x.Another);
  });
Run Code Online (Sandbox Code Playgroud)