2013-10-06 26 views
1

仅当我在xml文件中设置property-ref时,才收到此异常。将nhibernate属性-ref设置为一对多为主键以外的其他属性失败

初始化[Domain.Entities.R#12345] -failed懒洋洋地初始化角色的集合: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的第一次运行。

回答

0

错误消息给你答案。 R类中的一组LP对象默认是延迟加载的。这意味着您需要在会话中访问LP集合。

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

+0

科林感谢您的回复。 ISession是由IoC创建的;我不明白的是我有一个有效的ISession在我正在使用的函数中。 This works ... ISession is used var lp2 = _db.Query ().Take(100); 这不起作用,并且无法访问ISession。 var lp = queryResults.First()。LP; 所以问题是......为什么一条线能够访问ISession而另一条线不能? 再次感谢! – ben

+0

如果删除了property-ref,它将生成延迟加载的查询,而不会出现ISession异常。当添加property-ref时会发生ISession异常。问题是数据模型需要使用AnotherField而不是表的主键进行查询。 <集名称= “LP”> <键列= “AnotherField”/> <一个对多类= “Domain.Entities.LP” 未找到= “忽略”/> – ben

+0

嗯,你说这条线路工作 var lp2 = _db.Query ().Take(100); 但这是一个未评估的LINQ表达式。您是否尝试过实际访问lp2中的值(即迭代它们)? 此外,行查询LP对象。这不是问题。问题是访问R对象上的LP集合。除非我读错了,否则它们是两个完全不同的查询。 –

相关问题