我有一个Rotation
类,其中包含对多个Advert
个对象列表的引用。我更喜欢Rotation
具有List<List<Advert>>
类型属性的实现来保存这些属性,但是我无法想出支持它的NHibernate映射。
在数据库架构中,Rotation
和Advert
之间的多对多关系表示为表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?
答案 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类,其中包含广告列表。然后,广告包含父子关系中的子广告列表。