1

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

为什么该属性没有被延迟加载?

4

1 回答 1

1

我认为该值会被延迟加载,这就是虚拟的重点吗?

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

我相信您所要做的就是.LazyLoad在映射中标记单个属性(有关更多信息,请参阅惰性属性):

Map(x => x.TotalValue)
    .LazyLoad() // <-----
    .CustomType(typeof(MoneyCompositeUserType))
    .Columns.Clear()
    .Columns.Add("TotalValue_Amount", "TotalValue_Currency");
于 2013-06-05T12:21:01.583 回答