Nhibernate 延迟加载ICompositeUserType

Nhibernate 延迟加载ICompositeUserType,nhibernate,Nhibernate,我有一个类MoneyCompositeUserType:ICompositeUserType 我在映射中这样使用: public InvoiceMap() { Table("Invoices"); Id(x => x.Id); Map(x => x.Customer); Map(x => x.Number); Map(x => x.TotalValue) .CustomType(typeof(MoneyComposi

我有一个
类MoneyCompositeUserType:ICompositeUserType

我在映射中这样使用:

public InvoiceMap()
{
    Table("Invoices");
    Id(x => x.Id);
    Map(x => x.Customer);
    Map(x => x.Number);
    Map(x => x.TotalValue)
        .CustomType(typeof(MoneyCompositeUserType))
        .Columns.Clear()
        .Columns.Add("TotalValue_Amount", "TotalValue_Currency");
}
下面是课堂:

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"));
}
使用(var session=NHibernateHelper.OpenSession())
{
var fromDb=session.Get(invoice.Id);
Assert.IsFalse(NHibernate.NHibernateUtil.IsPropertyInitialized(fromDb,“TotalValue”);
}
为什么不延迟加载该属性

我以为这个值会被延迟加载,这就是虚拟的意义,对吗

不完全是这样——NHibernate需要您的属性是虚拟的,这样它就可以使用代理类代替您的类来启用延迟加载。仅因为属性标记为虚拟,所以未启用延迟加载

我相信您只需在映射中用
.LazyLoad
标记单个属性即可(有关更多信息,请参阅):

Map(x=>x.TotalValue)
.LazyLoad()//
我以为这个值会被延迟加载,这就是虚拟的意义,对吗

不完全是这样——NHibernate需要您的属性是虚拟的,这样它就可以使用代理类代替您的类来启用延迟加载。仅因为属性标记为虚拟,所以未启用延迟加载

我相信您只需在映射中用
.LazyLoad
标记单个属性即可(有关更多信息,请参阅):

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