Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 如何映射列表<;列表<;实体类>&燃气轮机;在尼伯内特?_Nhibernate_Many To Many_Hbm - Fatal编程技术网

Nhibernate 如何映射列表<;列表<;实体类>&燃气轮机;在尼伯内特?

Nhibernate 如何映射列表<;列表<;实体类>&燃气轮机;在尼伯内特?,nhibernate,many-to-many,hbm,Nhibernate,Many To Many,Hbm,我有一个Rotation类,它包含对Advert对象的多个列表的引用。我更喜欢Rotation具有类型为List的属性的实现来保存这些属性,但我无法提供支持这一点的NHibernate映射 在数据库模式中,Rotation和Advert之间的多对多关系表示为带有以下列的表RotationAdvert: RotationID AdvertID 变体(“水平位置)/外部列表中的索引) 位置(“垂直位置)/内部列表中的索引) 我找到的最佳解决方案是在旋转上实现固定数量的列表类型属性,并使用元素扩展

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

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

  • RotationID
  • AdvertID
  • 变体
    (“水平位置)/外部列表中的索引)
  • 位置
    (“垂直位置)/内部列表中的索引)
我找到的最佳解决方案是在
旋转
上实现固定数量的
列表
类型属性,并使用
元素扩展映射:

<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
类压缩到模型中,而无需在数据库中创建新表,并以某种方式将
列表
属性映射到
Rotation
?或者我必须在数据库中创建一个新表,只是为了保存每个
旋转变量的ID

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

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


class AdvertVariant
{
  int Variant { get; set; }
  Advert Advert { get; set; }
}
然后,您可以轻松创建如下属性:

class Rotation
{
  //...
  IDictionary<int, IList<Adverts>> AdvertsByVariant
  {
    return VariantAdverts.ToDictionary(x => x.Variant, y => y.Advert);
  }
}
类轮换
{
//...
词典广告变量
{
返回VariantAdverts.ToDictionary(x=>x.Variant,y=>y.Advert);
}
}

我建议开设一个轮换班,里面有一系列广告。然后,一个广告包含一个父子关系中的子广告列表。

我今天遇到了同样的问题。阅读Hibernate文档并在第6.1节:集合映射中找到答案:

集合不能包含其他集合


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

感谢链接,它似乎也支持了我得出的结论。我在Ayende的一篇博客文章中发现了一个关于NHibernate的类似声明。在我的特殊情况下,我最终使用了一个
字典
,以及一个附加的非持久性属性,使我能够进行所需的选择。这使我能够保持数据库的原样——没有引入新的实体。是的,我正在使用一个非持久化字典与我的一些集合进行交互。对于字典项的crud更新似乎也很好。
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);
  }
}