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);
}
}