2014-11-11 3 views
1

저는 일대일 순환 참조가있는 클래스가 있으며, 다음과 같이 보일 것이라고 가정합니다.일대일 Nhibernate가 다중 SQL 문을 호출합니다.

public class Foo 
{ 
    public Bar Bar { get; set; } 

    /* Some irrelevant code */ 
} 

public class Bar 
{ 
    public Foo Foo { get; set; } 

    /* Some irrelevant code */ 
} 

과 유창한 NHibernate에지도

BarMap 
{ 
    Table("Bars"); 
    // Some mappings 
    Reference(x => x.Foo).Column("FooId"); 
} 

FooMap 
{ 
    Table("Foos"); 
    // Some Mappings 
    HasOne(x => x.Bar).PropertyRef(x => x.Foo).Not.Lazy.Cascade.SaveUpdates(); 
} 

난 당신이 게으르게 내가 원하는 그래서 NHibernate에의 일대일 관계를로드 할 수 없습니다 실현 Foo에서 무언가를 원할 때 바 전체를 모두 선택하여 Foo에 가입시키는 것입니다.

var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList(); 

Nhibernates 각 푸 하나의 줄을 선택, 여러 SQL 문을 실행합니다 은 내가 줄을 가져 오기 위해 필요하지만 실행할 때 생각. 두 번만 선택하고 싶습니다. Foo에 한 번, Bar에 한 번 -이 기능은 게으르지 않습니다. 어떻게해야합니까?

답변

0

내 문제는 내가 바는 다른 객체에 대한 또 다른 순환 참조를하였습니다이었다 바즈는 말한다.

var Foos = session 
    .Query<Foo>() 
    .Fetch(x => x.Bar) 
    .ThenFetch(x => x.Baz) 
    .ToList(); 

내가 생각할 때 맨 위에 정렬 나는 Foos 테이블에 몇 개의 필드 만 필요로했습니다.

0

원하는 것을 성취하기 위해 선물을 사용할 수 있습니다. 예를 들어 :

session.Query<Bar>().Fetch(x => x.Foo).ToFuture(); 
var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList(); 

아이디어는 첫 번째 쿼리에 ToFuture()를 사용하는 두 쿼리가 동시에 실행되도록하며, NHibernate에 두 번째 쿼리를 채울 수 있도록 첫 번째 쿼리의 결과를 사용할 수 있다는 것이다. 실제 쿼리를 사용하여 예상대로 작동하도록해야 할 수도 있습니다.

BarMap 
{ 
    Table("Bars"); 
    Reference(x => x.Foo).Column("FooId"); 
    HasOne(x => x.Bar).PropertyRef(x => x.Bar).Not.Lazy.Cascade.SaveUpdates(); 
} 

BazMap 
{ 
    Table("Baz"); 
    Reference(x => x.Foo).Column("BarId"); 
} 

그래서 내가 푸, 바, 바즈에 가입하여 문제를 해결 :

+0

내 코드에서 또 다른 문제점을 발견했습니다. Bar는 Foo와 같은 방식으로 다른 클래스에 일대일 순환 참조를 사용합니다 ... – Minivergur

관련 문제