加载惰性代理属性

本文关键字:属性 代理 加载 | 更新日期: 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)应该可以工作。

但是,我建议重新考虑为什么需要这样做,并考虑使用更粗粒度的会话(即早点打开它,稍后关闭它)。