我有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"));
}
为什么该属性不会被延迟加载?
答案 0 :(得分:1)
我认为该值将是延迟加载的,这是虚拟对的点?
不完全 - NHibernate需要您的属性为virtual
,以便它可以使用代理类代替您的类来启用延迟加载。仅仅因为属性标记为虚拟而未启用延迟加载。
我认为您应该做的就是在地图中使用.LazyLoad
标记单个属性(有关详细信息,请参阅lazy properties):
Map(x => x.TotalValue)
.LazyLoad() // <-----
.CustomType(typeof(MoneyCompositeUserType))
.Columns.Clear()
.Columns.Add("TotalValue_Amount", "TotalValue_Currency");