NHibernate:无法初始化集合:

时间:2014-05-11 15:46:15

标签: asp.net-mvc nhibernate many-to-many nhibernate-mapping

我正在与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 =?]

此外,我不确定我是否实现了多对多关系。这是我的表结构:

雕像

  • IdStatue
  • 名称

关键字

  • IdKeyword
  • 名称

StatueKeyword

  • IdStatueKeyword
  • IdStatue
  • IdKeyword

雕像类:

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>

我需要将这个网站作为硕士论文,所以非常感谢任何帮助!

1 个答案:

答案 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>

同时检查以下内容:

小引用:

  

使用<key>元素声明从集合表到拥有类表的外键。

另一个提示,如果你有配对表的ID列,你应该尝试使用增强功能:

来自doc的另一个引用 idbag

  

请注意,<idbag>的更新效果要比普通<bag>好得多! NHibernate可以有效地定位各行,并单独更新或删除它们,就像列表,地图或集合一样。

最后,我(个人)会鼓励您使用many-to-many。我的观点是,最好避免它。请参阅:24. Best Practices (引用:)

  

不要使用异国情调的关联映射。

     

真正的多对多关联的良好用例很少见。大多数情况下,您需要存储在“链接表”中的其他信息。在这种情况下,使用两个一对多关联到中间链接类要好得多。事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要。

也许稍后也会检查这些: