如何映射List <list <entityclass>&gt;在NHibernate?</list <entityclass>

时间:2010-01-04 11:15:25

标签: nhibernate many-to-many hbm

我有一个Rotation类,其中包含对多个Advert个对象列表的引用。我更喜欢Rotation具有List<List<Advert>>类型属性的实现来保存这些属性,但是我无法想出支持它的NHibernate映射。

在数据库架构中,RotationAdvert之间的多对多关系表示为表RotationAdvert,其中包含以下列:

  • RotationID
  • AdvertID
  • Variant(“水平位置”/外部列表中的索引)
  • Position(“垂直位置”/内部列表中的索引)

我发现的最佳解决方案是在List<Advert>上实施固定数量的Rotation类型属性,并为每个属性扩展映射{/ 1}}:

<list>

但是,这需要我指定固定数量的变体,我真的很想避免。

我的其他选择是什么?我可以将<list name="Variant1" table="RotationAdvert" where="Variant = 1"> <key column="RotationID"/> <index column="Position"/> <many-to-many class="Advert" column="AdvertID"/> </list> <list name="Variant2" table="RotationAdvert" where="Variant = 2"> <key column="RotationID"/> <index column="Position"/> <many-to-many class="Advert" column="AdvertID"/> </list> etc... 类压缩到模型中 - 无需在数据库中创建新表 - 并以某种方式在RotationVariant上映射List<RotationVariant>属性吗?或者我是否必须在数据库中创建一个新表,只是为每个Rotation保留一个ID?

3 个答案:

答案 0 :(得分:1)

我能想到的最好的方法是使模型适应所需的数据库结构。

class Rotation
{
  IList<AdvertVariant> AdvertVariants { get; private set; }
}


class AdvertVariant
{
  int Variant { get; set; }
  Advert Advert { get; set; }
}

映射:

<class name="Rotation">
  <list name="AdvertVariants" table="RotationAdvert" >
    <key column="RotationID"/>
    <index column="Position"/>
    <one-to-many class="AdvertVariant"/>
  </list>
</class>

<class name="AdvertVariant">
  <property name="Variant" />
  <many-to-one name="Advert" column="VariantId"/>
</class>

数据库:

Rotation:
  id

AdvertVariant
  id
  Variant
  RotationId
  VariantId

Advert
  id

然后您可以轻松创建如下属性:

class Rotation
{
  //...
  IDictionary<int, IList<Adverts>> AdvertsByVariant
  {
    return VariantAdverts.ToDictionary(x => x.Variant, y => y.Advert);
  }
}

答案 1 :(得分:1)

我今天遇到了同样的问题。阅读Hibernate文档并在第6.1节:集合映射https://www.hibernate.org/hib_docs/nhibernate/html/collections.html

中找到答案
  

集合可能不包含其他集合

我在NHibernate文档中找不到这个确切的句子,但似乎适用相同的规则。像Stephan和Chris所说,你可能需要另一个实体来保存这些值。

答案 2 :(得分:0)

我建议有一个Rotation类,其中包含广告列表。然后,广告包含父子关系中的子广告列表。