2013-06-04 1 views
3

NHibernate에 새로운 것으로 간주됩니다. 제 기사 엔티티 클래스에 두 개의 지연 속성이 있어야합니다. 그 중 하나는 사용자 기타 콘텐츠입니다. 내가 뭔가 잘 작동NHibernate Linq 게으른 문자열 속성을 가져 오는 eager 호출

using(ISession session = sessionFactory.OpenSession()) { 
    return session.Query<Article>() 
        .SingleOrDefault(a => a.Id == id); 
} 

처럼 선택

<class name="Article" table="TBL_ARTICLE"> 
    <id name="Id" column="ART_ID"> 
     <generator class="native" /> 
    </id> 
    <property name="UserId" column="USR_ID" not-null="true" /> 
    <many-to-one name="User" column="USR_ID" insert="false" update="false" /> 
    <property name="Content" column="ART_CONTENT" not-null="true" lazy="true" /> 
</class> 

public class Article 
{ 
    public virtual long Id { get; set; } 
    public virtual long UserId { get; set; } 
    public virtual User User { get; set; } 
    public virtual string Content { get; set; } 
} 

처럼 내 기업 및 매핑이다. using 블록 밖에서 User 또는 Content 속성에 액세스하려고하면 일종의 지연로드 예외가 발생합니다. 이것이 내가 예상 한 것입니다.

사용자 데이터를 간절히 가져 오는 경우가 있습니다. 나는 이것을 다음과 같이 선택한다 :

using(ISession session = sessionFactory.OpenSession()) { 
    return session.Query<Article>() 
        .Fetch(a => a.User) 
        .SingleOrDefault(a => a.Id == id); 
} 

여전히 잘 동작한다. 사용중인 블록 외부에서 User 속성에 액세스하려고하면 해당 속성 값을 가질 수 있지만 Content 속성에 액세스하려고 할 때 일종의 지연로드 예외가 발생하며 예상 한 결과가 발생합니다.

내가

using(ISession session = sessionFactory.OpenSession()) { 
    return session.Query<Article>() 
        .Fetch(a => a.Content) 
        .SingleOrDefault(a => a.Id == id); 
} 

같은 콘텐츠 데이터를 가져 오기 할 때 나는 예외를 얻을 : 나는 HQL에 의해이 일에 대한 몇 가지 블로그 게시물을 읽을 수는 있지만 내가 Linq에를 사용하여 솔루션을 찾고 있어요

Invalid join: a.Content 
[.SingleOrDefault[Repository.NH.Article](.Fetch[Repository.NH.Article,System.String] 
(NHibernate.Linq.NhQueryable`1[Repository.NH.Article], Quote((a,) => (a.Content)),), 
Quote((a,) => (Equal(a.Id, 1))),)] 

공급자.

답변

1

구조체는 객체 간 관계를 매핑하는 속성, 즉 "참조", "다 대일"또는 "다 대다"로 매핑되는 속성에서만 작동합니다.

따라서 User 속성은 예상대로 작동하지만 문자열은 Content 속성이 아닙니다. 일반적으로 참조 유형에 게으른를 사용

session.CreateQuery("from Article fetch all properties") 
+0

I 콘텐츠 데이터를 열망 가져올 수있는 샤스이 있습니까? EF와 같은 메소드를 포함 할 수 있습니다. 그렇지 않다면, linq 공급자를 사용하여 게으른 스칼라 속성을 가져올 수 없다고 말할 수 있습니까? –

+0

@ MehmetAtaş 내가 아는 바는 아니지만 - 분명히 당신이 사용하는 문장 내에서 Content 속성에 접근하면 그것은로드 될 것입니다.하지만 초기 쿼리의 일부로 채워지지 않으므로 늦게로드됩니다. 왜이 특정 자산을 늦게로드하고 싶습니까? MehmetAtaş EF @ – CSL

+0

메소드의 기능을 포함하는 기사의 내용은 그 nHibernate 수 – CSL

0

당신 : 난 당신이 LINQ 구문을 사용하여 원하는 것을 얻을 수 있지만,이 fetch all properties 힌트를 사용하여 해당 HQL 문을 사용 할 수 있어야한다 생각하지 않는다 추가 조사 후

, 예. SQL에서 Join을 발생시키는 것들. Content가 문자열이기 때문에 객체 그래프와 정확히 같은 레벨에 있으므로 실제로하는 일은별로 의미가 없습니다. 무슨 일이 일어나는가는 nhibernate 세션 외부에서 Objects 문자열 속성을 참조하려고 할 때 오류가 발생하는 것입니다. 반면에 참조가 아닌 유형을 가져올 수 없으므로 문제가 발생합니다. 그러나 조금 다른 것을 할 수 있습니다. Lazy 콘텐츠로 개체를 끌어 내야하는 경우 nhibernate 세션의 범위 내에서 쿼리를 사용하고 콘텐츠를 열정적으로 끌어 오려면 _session.Get<Article>(id); 데이터베이스에서 전체 개체 그래프로드를 사용하십시오.

+0

를 검색 할 때이 성능 저하 콘텐츠 데이터를로드 열망보다 더 나은 여부까지 무게해야 (id)'는 게으른 속성을 열망하지 않을 것입니다. 그들은 액세스에 대한 별도의 질의로 요청 될 것입니다. – Nathan

0

다른 설명과 마찬가지로 참조 및 지연 스칼라 속성이 다르게 동작하므로 LINQ Fetch 메서드는 전자의 경우에만 적합합니다. 당신이 게으른 속성을 열망를로드 할 때 CSL은, 제안, 대신 LINQ의

  • 사용 HQL :

    이 문제에 대한 세 가지 가능한 솔루션이 있습니다.

  • 게으른 속성을 사용하여 목록을 표시하는 대신에 전체 개체를 가져 오는 경우 프로젝션을 사용하지 마십시오.
  • 세션의 범위 인 실제 문제를 수정하십시오. 엔티티를 사용하는 동안 항상 사용할 수 있어야합니다.
관련 문제