NHibernate:映射一对多关系以填充集合而不使用第二类

我要使用NHibernate映射的数据库有一个Plan表和Date表.一个计划可以与许多日期相关联,这可以通过具有PLAN_ID外键列的Date表来建模.

这些是我当前的类和映射:

public class Plan
{
    public virtual int Id { get; set; }
    public virtual IList<PlanDate> Dates { get; set; }
}

public class PlanDate
{
    public virtual int Id { get; set; }

    public virtual int PlanId { get; set; }

    public virtual DateTime? Date { get; set; }
}
  <class name="Plan" table="PLAN">
    <id name="Id" unsaved-value="0">
      <column name="ID" not-null="true" />
      <generator class="native"/>
    </id>
    <bag name="Dates">
      <key column="PLAN_ID" />
      <one-to-many class="PlanDate" />
    </bag>
  </class>
  <class name="PlanDate" table="PLAN_DATE">
    <id name="Id" unsaved-value="0">
      <column name="ID" not-null="true" />
      <generator class="native"/>
    </id>
    <property name="Date" column="DATE" type="DateTime"/>
    <property name="PlanId" column="PLAN_ID" type="integer"/>
  </class>

这样可以使用PlanDate对象正确地填充Plan对象中的Dates集合.但是,理想情况下,我希望在Plan类中具有DateTime对象的集合.除了包含日期以外,我对PlanDate类没有任何用处,并且我不会更新数据库中的数据.例:

public class Plan
{
    public virtual int Id { get; set; }
    public virtual IList<DateTime> Dates { get; set; }
}

有什么方法可以映射到此类结构,并摆脱PlanDate类?

解决方法:

您可以使用此映射:

<list name="Dates" table="PlanDates">
    <key column="PlanId"/>
    <index column="Position" />
    <element column="Value" type="System.DateTime"/>
</list>

xml节点< index column =“ Position” />引用元素在列表中的位置.

而您的课堂正是您想要的方式:

public class Plan
{
    public Plan()
    {
        this.Dates = new List<DateTime>();
    }
    public virtual int Id { get; set; }
    public virtual IList<DateTime> Dates { get; set; }
}

您可以找到更多信息here.

上一篇:生成时未知数据类型时,将数据对象映射到合适的ViewModel


下一篇:Java-Hibernate数据库更改