C# 加载惰性代理属性

C# 加载惰性代理属性,c#,fluent-nhibernate,C#,Fluent Nhibernate,我需要在设置为延迟加载的对象上加载属性。当我尝试使用NhibernateUtil.Initialize()访问或加载它时,我得到了相同的错误: “初始化[ProjectName.Logic.Entities.AddressList#9]-无法初始化代理-无会话。” 我可以通过调用必要的方法在“using”子句中打开会话来确保会话确实存在。(我们已经隐藏了会话创建,因此如果需要,使用参数“true”实例化存储库对象也将创建会话工厂并打开会话。通过在“using”子句触发断点进行验证。) 详细映射:

我需要在设置为延迟加载的对象上加载属性。当我尝试使用NhibernateUtil.Initialize()访问或加载它时,我得到了相同的错误:

“初始化[ProjectName.Logic.Entities.AddressList#9]-无法初始化代理-无会话。”

我可以通过调用必要的方法在“using”子句中打开会话来确保会话确实存在。(我们已经隐藏了会话创建,因此如果需要,使用参数“true”实例化存储库对象也将创建会话工厂并打开会话。通过在“using”子句触发断点进行验证。)

详细映射:

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();
    }
}
公共类详细信息映射:类映射
{
公共详细信息地图()
{
表(“地址详情SCCN”);
//唯一标识符
Id(x=>x.Id,“Id”)
.GeneratedBy.Identity();
//多对一关系(列表中有许多详细信息)
引用(x=>x.AddressList,“ListId”)
.LazyLoad()
.Not.Nullable()
.Cascade.None();
//多对一关系(成员有详细信息)
参考(x=>x.成员,“成员ID”)
.Not.LazyLoad()
.Not.Nullable();
//第一行地址
地图(x=>x.地址,“地址”)
.Nullable();
//第二行地址
映射(x=>x.Address2,“Address2”)
.Nullable();
//城市
地图(x=>x.城市,“城市”)
.Nullable();
//陈述
映射(x=>x.状态,“状态”)
.Nullable();
//拉链
地图(x=>x.Zip,“Zip”)
.Nullable();
//最后确定日期
映射(x=>x.FinalizedDate,“FinalizedDate”)
.CustomType(typeof(DateTime))
.Nullable();
//创建列表的日期
映射(x=>x.CreatedDate,“CreatedDate”)
.CustomType(typeof(DateTime))
.Not.Nullable();
}
}

在初始化会话上的任何属性之前,您需要将邮件对象附加到会话。为此,您必须在存储库中公开一个方法,该方法将调用:

session.Lock(entity, LockMode.None);
然后将实体(邮件)与会话相关联,然后调用NHibernateUtil.Initialize(Mailings.AddressList)应该可以工作


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

您确定在访问延迟加载的项目时会话仍然打开吗?如果在using语句结束后(即在消费方法中)访问延迟加载的项,则会话可能已经关闭。
session.Lock(entity, LockMode.None);