我有以下实体
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或可以从某种存储库访问。
答案 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);
});