【问题标题】:mapping 'value object' collection in (Fluent) NHibernate在(Fluent)NHibernate 中映射“值对象”集合
【发布时间】:2010-05-17 16:01:50
【问题描述】:

我有以下实体

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 或可以从某种存储库访问。

【问题讨论】:

  • 在分析问题后,我接近得出结论,即 Hour 对象需要是具有 Id 的实体...

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


【解决方案1】:

根据您的操作方式,您需要将您的集合映射为元素映射或组件集合(在 NHibernate 术语中为 &lt;element&gt;&lt;composite-element&gt;)。前者需要一个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);
  });

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2013-04-04
    • 1970-01-01
    • 2012-02-08
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多