2

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

Rotation在数据库模式中,和之间的多对多关系Advert表示为RotationAdvert具有以下列的表:

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

我找到的最好的解决方案是实现固定数量的List<Advert>类型化属性,并使用每个元素Rotation扩展映射:<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 RotationVariant

4

3 回答 3

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);
  }
}
于 2010-01-06T08:26:12.953 回答
1

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

集合不能包含其他集合

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

于 2010-01-13T21:42:26.417 回答
0

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

于 2010-01-08T19:53:23.120 回答