将一对多的nhibernate property-ref设置为主键以外的属性会失败

时间:2013-10-06 21:33:22

标签: c# nhibernate-mapping hibernate-onetomany isession

我只在我的xml文件中设置property-ref时才收到此异常。

初始化[Domain.Entities.R#12345] - 无法懒惰地初始化角色集合:Domain.Entities.R.LP,没有关闭会话或会话

LP.hbm.xml
----------
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Entities" assembly="Domain">

<class name="LP" table="LP">
  <id name="Id">
    <column name="Id" sql-type="int" not-null="true"/>
  </id>

  <property name="AnotherField"/>
  <property name="PaymentDate"/>
  <property name="PaymentAmount"/>
</class>

</hibernate-mapping>


R.hbm.xml
---------
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Entities" assembly="Domain">
<class name="R" table="R">
<id name="Id">
  <column name="Id" not-null="true"/>
</id>

<property name="AnotherField"/>

<set name="LP">
  <key column="AnotherField" property-ref="AnotherField" />
  <one-to-many class="Domain.Entities.LP" not-found="ignore" />
</set>
</class>
</hibernate-mapping>

        IQueryable<Entities.R> query = _db.Query<Entities.R>();

        var query2 = _db.Query<Entities.LP>().ToList();

        var queryResults = query.ToList();

        Iesi.Collections.Generic.ISet<Entities.LP> lp; 
        try
        {
            lp = queryResults.First().LP;   <--- this fails with exception
        }
        catch (Exception ex) 
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            var lp2 = _db.Query<Entities.LP>().Take(100); <-- works just fine
        }

我不明白为什么lp2设置得很好,但是lp失败了?我知道数据模型并不理想,但这是我现在必须要处理的。如果我从nhprof中的xml文件中删除property-ref,我看到它调用了SQL表(错误的值,所以我没有得到数据),但它没有失败。这只有在我设置了property-ref时才会发生。

非常感谢任何帮助。这是我第一次与NH合作。

1 个答案:

答案 0 :(得分:0)

错误消息为您提供答案。默认情况下,R类中的LP对象集是延迟加载的。这意味着您需要在会话中访问LP集合。

通常,您可以通过获取ISessionFactory并在using块中调用OpenSession来完成此操作。 访问使用块中的集合,你应该没问题。