如何解包延迟加载的实体?

时间:2013-11-10 15:57:54

标签: c# fluent-nhibernate lazy-loading

我正在使用FluentNHibernate 3.2,我有一个复杂的实体, 我想初始化一个实体,所有代理都已初始化。 我已经使用了NHibernateUtil.Initialize,但是对于所有代理,它都不起作用, Session is closed!

这是我的映射:

internal sealed class CityMap : ClassMap<City> {
    public CityMap() {
        Id(x => x.Id).GeneratedBy.Identity().Column("Id");
        Map(x => x.Name, "Name");
        Map(x => x.AlterName, "AlterName");
        Map(x => x.ZipCode, "ZipCode5");

        HasMany(x => x.Streets)
            .LazyLoad()
            .ExtraLazyLoad()
            .KeyColumn("GovId")
            .Cascade.All();

        Table("Cities");
    }
}

internal sealed class StreetMap : ClassMap<Street> {
    public StreetMap() {
        Id(x => x.Id).GeneratedBy.Identity().Column("Id");
        Map(x => x.Name, "Name");
        Map(x => x.AlterName, "AlterName");
        References(x => x.City).LazyLoad().Column("GovId");
        Table("Streets");
    }
}

Here is my invocation:

using (UnitOfWork.Start()) {
   // i get whole results until i need a Streets property      
   var source =_citiesRepository.Query.SingleOrDefault(c => c.Name.Contains(query));

   // here I've tried to use NHibernateUtil.Initialize like so...
   NHibernateUtil.Initialize(source); // <== here

}

当我尝试获取某些街道时,我收到 Exception Session is closed! , 该怎么解决这个问题?

我不想禁用延迟加载...

1 个答案:

答案 0 :(得分:0)

延迟加载的实体总是在第一次访问时被加载对象并在第一个位置创建代理的同一会话加载。当会话关闭并处理完毕时,它显然无法再做任何工作,在你的情况下,它意味着它无法加载任何进一步的延迟加载依赖。

有两种可能的解决方案,一种是让会话保持较长时间,因此它有机会在存储库调用后加载对象。另一种方法是让repo立刻加载所有图表,热切地。

根据您调用repo的代码,您在UnitOfWork块中使用using。不知道它的内部,但我想该对象管理会话生命周期,并且存在主要问题(如果不是这样的话,请纠正我),因为当你退出using后将其处理掉,因此例外。您可能需要在某个地方保持会话活动的时间比延迟加载工作的时间长。您可能希望将UnitOfWork传递给存储库/服务,让调用者管理其生命周期。