2016-11-10 6 views
0

다음은 클래스에 대한 매핑 및 매핑 오버라이드입니다. Member에서 IsActive 메소드를 호출하면 어떤 이유로 nhibernate가 데이터베이스에서 MemberExtraFields를 가져옵니다. 이것은 목록에서 메소드를 호출 할 때 n + 1 문제를 일으키고 있습니다. Fluent Nhibernate 메소드를 호출 할 때 일대일 게으른 로딩

내가이 문제를 해결하는 수 있나요, 내가 (거짓 NOPROXY, 프록시,) 모든 게으름

public class Member 
{ 
    public virtual Guid Id { get; set; } 

    public virtual MemberExtraFields MemberExtraFields { get; set; } 


    public virtual bool Enabled { get; set; } 

    public virtual bool IsActive() 
    { 
     return Enabled; 
    } 

} 

public class MemberExtraFields 
{ 
    public virtual Guid Id { get; set; } 

    public virtual bool ExcludeFromCompetitions { get; set; } 

    public virtual Member Member { get; protected set; } 
} 

public class MemberMap : IAutoMappingOverride<Member> 
{ 
    public void Override(AutoMapping<Member> mapping) 
    { 
     mapping.Id(x => x.Id).GeneratedBy.GuidComb(); 
     mapping.HasOne(x => x.MemberExtraFields) 
         .Cascade.All().LazyLoad(Laziness.NoProxy); 
    } 
} 

public class MemberExtraFieldsMap : IAutoMappingOverride<MemberExtraFields> 
{ 
    public void Override(AutoMapping<MemberExtraFields> mapping) 
    { 
     mapping.Id(x => x.Id).GeneratedBy.Foreign("Member"); 
     mapping.HasOne(x => x.Member).Constrained().ForeignKey(); 
    } 
} 
+0

'.HasOne()'대신'References()'를 시도 했습니까? 내가 기억한다면'.HasOne()'참조는 항상로드됩니다. – Rabban

+0

@Rabban을 참조로 변경했습니다. –

답변

0

사용 References 대신 HasOne 있습니다. HasOne은 밀 결합입니다.

IsActive() 메서드는 데이터베이스 필드와 연결된 Enabled 속성을 반환하므로 거기에서로드해야합니다. NHibernate이 해당 속성을 채우기 위해 쿼리를 실행하면 MemberExtraFields MemberExtraFields { get; set; } 속성을 채우기 위해 다른 쿼리를 실행합니다.

허용되는 답변 here을 참조하십시오.

+0

감사합니다. 실제로 작동했습니다. 나는 그것이 받아 들여지는 대답을 조정해야했다. 데이터베이스 측에서 MemberExtraFields 테이블의 기본 키와 외래 키가 동일하므로 양쪽 멤버 모두를 참조로 변경해야했습니다. 따라서 멤버를 추가하려고하면 nhibernate가 멤버를 추가하기 전에 먼저 memberextrafield를 추가하려고 시도하고있었습니다. "INSERT 문이 FOREIGN KEY 제약 조건과 충돌했습니다." 이를 극복하기 위해 멤버의 MemberExtraFields 부분을 저장하지 않도록 매핑을 업데이트했습니다. –