2013-10-06 7 views
1

내 XML 파일에서 property-ref를 설정할 때만 예외가 발생합니다.기본 키 이외의 속성에 대한 일대 다 nhibernate 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와의 첫 번째 공연입니다.

답변

0

오류 메시지가 답을 제공합니다. R 클래스의 LP 개체 세트는 기본적으로 지연로드됩니다. 즉, 세션 내에서 LP 모음에 액세스해야합니다.

일반적으로 ISessionFactory를 가져 와서 using 블록에서 OpenSession을 호출하면됩니다. 사용중인 블록에서 컬렉션에 액세스하면 정상이어야합니다.

+0

응답 해 주셔서 감사합니다. ISession은 IoC에서 생성됩니다. 내가 이해할 수없는 것은 내가 가지고있는 함수의 컨텍스트에서 유효한 ISession이 있다는 것입니다. 이 작업 ... ISession이 사용되었습니다. var lp2 = _db.Query () .Take (100); 이것은 작동하지 않으며 ISession에 액세스 할 수 없습니다. var lp = queryResults.First(). LP; 질문은 ... 왜 한 줄은 다른 곳에서는 액세스 할 수없는 반면에 ISession에 액세스 할 수 있습니까? 다시 한번 감사드립니다. – ben

+0

<일대 다 class = "Domain.Entities.LP"not-found = "ignore"/ > property-ref가 제거되면 ISession 예외없이 지연로드 된 쿼리가 생성됩니다. 속성 -ref가 추가되면 Isession 예외가 발생합니다. 문제는 데이터 모델이 테이블의 기본 키 대신 AnotherField를 사용하여 쿼리해야한다는 것입니다. <세트 이름 = "LP"> <키 컬럼 = "AnotherField"/> 흠 – ben

+0

<일대 클래스 = "Domain.Entities.LP는"/ "무시"= -없는>을 당신은이 라인이 작동한다고 말합니다. var lp2 = _db.Query () .Take (100); 하지만 평가되지 않은 LINQ 식입니다. 실제로 lp2의 값에 액세스하려고 시도 했습니까 (즉, 반복)? 또한 라인은 LP 개체를 쿼리합니다. 그것은 문제가 아닙니다. 문제는 R 개체의 LP 모음에 액세스하는 것입니다. 내가 틀린 것을 읽지 않는 한 그들은 완전히 다른 두 가지 질문입니다. –