2013-06-05 1 views
1

가 나는 내가 매핑에과 같이 사용 class MoneyCompositeUserType : ICompositeUserType게으른 부하 ICompositeUserType

public class Invoice 
{ 
    public virtual int Id { get; set; } 

    public virtual int Number { get; set; } 
    public virtual string Customer { get; set; } 
    public virtual Money TotalValue { get; set; } 
} 

나는 생각 값 것이라고 게으른로드가되면 virtual의 포인트가 맞습니까? 그러나 복합 사용자 유형의 NullSafeGet 메소드는 항목이로드 될 때 호출됩니다. 다음은 실패한 테스트입니다.

using (var session = NHibernateHelper.OpenSession()) 
{ 
    var fromDb = session.Get<Invoice>(invoice.Id); 
    Assert.IsFalse(NHibernate.NHibernateUtil.IsPropertyInitialized(fromDb, "TotalValue")); 
} 

왜이 속성은 지연로드되지 않습니까?

답변

1

나는 값이 게으른로드 될 것이라고 생각했는데, 그것이 바로 가상 권리의 포인트입니까?

은 정확 하 - 자 NHibernate는 게으른 로딩을 가능하게 에 클래스 대신에 프록시 클래스를 사용할 수 있도록 virtual을 할 당신의 재산을 필요로한다. 속성이 가상으로 표시 되었기 때문에 지연로드가 활성화되지 않습니다.

나는 당신이해야합니다 모든 (자세한 내용은 lazy properties 참조) 매핑 .LazyLoad와 개별 속성을 표시 믿습니다 :

Map(x => x.TotalValue) 
    .LazyLoad() // <----- 
    .CustomType(typeof(MoneyCompositeUserType)) 
    .Columns.Clear() 
    .Columns.Add("TotalValue_Amount", "TotalValue_Currency");