我正在与NHibernate斗争。我有一个小的ASP MVC网站。我设法设置了NHibernate,但是当我想要检索数据时,我得到了这个错误:
其他信息:无法初始化集合:[Lore.Models.DatabaseModels.Statue.Keywords#1] [SQL:SELECT keywords0_.IdStatueKeyword as IdStatue1_1_,keywords0_.IdKeyword as IdKeyword1_,keyword1_.IdKeyword as IdKeyword4_0_,keyword1_.Name as Name4_0_, keyword1_.Description as Descript8_4_0_ FROM Statue关键字0_左外连接关键字0_.IdKeyword = keyword1_.IdKeyword WHERE keywords0_.IdStatueKeyword =?]
此外,我不确定我是否实现了多对多关系。这是我的表结构:
雕像
关键字
StatueKeyword
雕像类:
public class Statue
{
public Statue()
{
Keywords = new List<Keyword>();
}
public int IdStatue { get; set; }
public string Name { get; set; }
public IList<Keyword> Keywords { get; set; }
}
关键字类
public class Keyword
{
public int IdKeyword { get; set; }
public string Name { get; set; }
}
雕像hbm文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Lore.Models.DatabaseModels" assembly="Lore">
<class name="Statue" table="Statue" lazy="false" >
<id name="IdStatue" column="IdStatue">
<generator class="identity" />
</id>
<property name="Name" column="Name" not-null="true" type="System.String" />
<bag name="Keywords" table="StatueKeyword" lazy="false">
<key column="IdStatueKeyword"/>
<many-to-many class="Keyword" column="IdKeyword"/>
</bag>
</class>
</hibernate-mapping>
关键字hbm文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Lore.Models.DatabaseModels" assembly="Lore">
<class name="Keyword" table="Statue" lazy="false" >
<id name="IdKeyword" column="IdKeyword">
<generator class="identity" />
</id>
<property name="Name" column="Name" not-null="true" type="System.String" />
<property name="Description" column="Description" not-null="true" type="System.String" />
</class>
</hibernate-mapping>
我需要将这个网站作为硕士论文,所以非常感谢任何帮助!
答案 0 :(得分:2)
问题应该/可能在<key>
映射中:
<bag name="Keywords" table="StatueKeyword" lazy="false">
<!-- <key> is representing column where current Statue ID should be searched
while the below one seems to be the ID column of the pairing table
so instead of this
<key column="IdStatueKeyword"/>
use this: -->
<key column="IdStatue"/>
<many-to-many class="Keyword" column="IdKeyword"/>
</bag>
同时检查以下内容:
many-to-many
小引用:
使用
<key>
元素声明从集合表到拥有类表的外键。
另一个提示,如果你有配对表的ID列,你应该尝试使用增强功能:
来自doc的另一个引用 idbag :
请注意,
<idbag>
的更新效果要比普通<bag>
好得多! NHibernate可以有效地定位各行,并单独更新或删除它们,就像列表,地图或集合一样。
最后,我(个人)会鼓励您使用many-to-many
。我的观点是,最好避免它。请参阅:24. Best Practices (引用:)
不要使用异国情调的关联映射。
真正的多对多关联的良好用例很少见。大多数情况下,您需要存储在“链接表”中的其他信息。在这种情况下,使用两个一对多关联到中间链接类要好得多。事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要。
也许稍后也会检查这些: