延迟加载CompositeUserType

时间:2013-06-05 12:07:29

标签: nhibernate

我有class 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"));
}

为什么该属性不会被延迟加载?

1 个答案:

答案 0 :(得分:1)

  

我认为该值将是延迟加载的,这是虚拟对的点?

不完全 - NHibernate需要您的属性为virtual,以便它可以使用代理类代替您的类来启用延迟加载。仅仅因为属性标记为虚拟而未启用延迟加载。

我认为您应该做的就是在地图中使用.LazyLoad标记单个属性(有关详细信息,请参阅lazy properties):

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