加载惰性代理属性
本文关键字:属性 代理 加载 | 更新日期: 2023-09-27 18:35:50
我需要在设置为延迟加载的对象上加载一个属性。 当我尝试访问它或使用NhibernateUtil.Initialize()加载它时,我收到相同的错误:
"正在初始化 [ProjectName.Logic.Entities.AddressList#9] - 无法初始化代理 - 无会话。"
我可以通过在"using"子句中调用打开会话的必要方法来确保会话确实存在。 (我们已经埋葬了我们的会话创建,以便实例化参数为"true"的存储库对象也将在需要时创建一个会话工厂并打开会话。 使用在"using"子句处触发的断点进行验证。
foreach (MemberViewModel MVM in _filteredMemberViewModels)
{
foreach (Detail Mailings in MVM.Member.Mailings)
{
//used for lazy loading
using (var repo = new AddressListRepository(true))
{
NHibernateUtil.Initialize(Mailings.AddressList);
}
}
}
详细映射:
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Table("AddressDetailsCCN");
// Unique Identifier
Id(x => x.Id, "Id")
.GeneratedBy.Identity();
// MANY TO ONE relationship (the list has many details)
References<AddressList>(x => x.AddressList, "ListId")
.LazyLoad()
.Not.Nullable()
.Cascade.None();
// MANY TO ONE relationship (Members have details)
References<Member>(x => x.Member, "MemberId")
.Not.LazyLoad()
.Not.Nullable();
// First line of Address
Map(x => x.Address, "Address")
.Nullable();
// Second line of Address
Map(x => x.Address2, "Address2")
.Nullable();
// City
Map(x => x.City, "City")
.Nullable();
// State
Map(x => x.State, "State")
.Nullable();
// Zip
Map(x => x.Zip, "Zip")
.Nullable();
// Finalized date
Map(x => x.FinalizedDate, "FinalizedDate")
.CustomType(typeof(DateTime))
.Nullable();
// Date the list is created by
Map(x => x.CreatedDate, "CreatedDate")
.CustomType(typeof(DateTime))
.Not.Nullable();
}
}
您需要先将 Mailings 对象附加到会话,然后才能初始化会话上的任何属性。 您必须在存储库上公开一个方法才能执行此操作,该方法将调用:
session.Lock(entity, LockMode.None);
然后将实体(Mailings)与您的会话相关联,然后调用NHibernateUtil.Initialize(Mailings.AddressList)应该可以工作。
但是,我建议重新考虑为什么需要这样做,并考虑使用更粗粒度的会话(即早点打开它,稍后关闭它)。