문제

테이블 부모와 테이블 아이가 있습니다. 어린이는 모색 키를 포함하여 부모 테이블을 포함하여 일대일 관계를 만듭니다. 다음은 유창한 nhibernate로 정의하는 매핑의 일부입니다.

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        WithTable("Parents");

        Id(x => x.Id, "ParentID")
        .WithUnsavedValue(0)
        .GeneratedBy.Identity();

        Map(x => x.Description, "Description");

        HasMany<Child>(x => x.Childs)
        .LazyLoad()
        .WithKeyColumn("ParentID")
        .IsInverse()
        .AsSet();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        WithTable("Childs");

        Id(x => x.Id, "ChildID")
        .WithUnsavedValue(0)
        .GeneratedBy.Identity();

        References(x => x.Parent, "ParentID")
            .CanNotBeNull()
            .LazyLoad();
    }
}

보시다시피 나는 관계에 Lazyload를 설정했습니다. 또한 모델 클래스에서 모든 속성은 가상으로 설정됩니다.

이제 간단한 쿼리를 위해 :

ICriteria crit = Session.CreateCriteria(typeof(Child))
    .Add(Expression.Eq("Id", 18));
IList<Child> list = crit.List<Child>();

SQL이 생성되었습니다.

SELECT this_.ChildID            as ChildID5_1_,
       this_.ParentID           as ParentID5_1_,
       parent2_.ParentID    as ParentID4_0_,
       parent2_.Description as Descript2_4_0_
FROM   Childs this_
       inner join Parents parent2_
         on this_.ParentID = parent2_.ParentID
WHERE  this_.ChildID = 18 /* @p0 */

보시다시피, 부모 테이블에 가입하고 해당 필드 (ID 및 설명)를 선택합니다. 그러나 내가 Lazyloading을 요청한 이후로 왜 그렇게합니까?

이제 쿼리를 변경하면 :

ICriteria crit2 = Session.CreateCriteria(typeof(Child))
    .SetFetchMode("Parent", FetchMode.Lazy)
    .Add(Expression.Eq("Id", 18));

생성 된 2 개의 SQL 쿼리가 있습니다.

SELECT this_.ChildID  as ChildID5_0_,
       this_.ParentID as ParentID5_0_
FROM   Childs this_
WHERE  this_.ChildID = 18 /* @p0 */

나에게 좋은 방법 : 가입 없음, 부모 테이블은 쿼리되지 않습니다. 그러나 나는 이것도이 두 번째를 얻는다 :

SELECT parent0_.ParentID    as ParentID4_0_,
       parent0_.Description as Descript2_4_0_
FROM   Parents parent0_
WHERE  parent0_.ParentID = 45 /* @p0 */

다시 부모 테이블을 쿼리합니다.

이 2 개의 쿼리는 라인 동안 생성됩니다.

IList<Child> list = crit.List<Child>();

나는 여기서 일어나는 일에 대해 완전히 무지합니다. 누군가 도울 수 있습니까?

도움이 되었습니까?

해결책

유창한 nhibernate 버전에 따라 다릅니다. 특정 지점까지 모든 엔티티가 ~ 아니다 게으른 적재하십시오. 이것은 명시 적으로 설정하는 것과 같습니다 lazy="false" 당신의 단체에서. 이것은 더 이상 그렇지 않지만, 그 시점 이전에 무엇이든 실행 중이라면이 동작을 볼 수 있습니다.

다중/참조 게으른 부하 설정은 대상의 엔티티 레벨 게으른 부하에 의해 무효화 되므로이 이전 버전의 FNH에서 실행중인 경우 엔티티 설정이 렌더링됩니다. References(...).LazyLoad() Moot에게 전화하십시오.

최신 버전의 FNH에 있는지 확인해야합니다. 그러나 그렇지 않으면 게으른로드를 명시 적으로 설정해야합니다. Parent 실재. 당신은 그것을 할 수 있습니다 LazyLoad 방법에 대한 방법 ClassMap<T>.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top