0

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

这是我的映射:

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

}

当我尝试获取一些 Streets 时,我收到了Exceptionthat Session is closed!,应该如何解决这个问题?

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

4

1 回答 1

0

延迟加载的实体总是在第一次访问时由获取对象并首先创建代理的同一会话加载。当会话关闭并处置时,它显然无法再做任何工作,在您的情况下,这意味着它无法加载任何进一步的延迟加载依赖项。

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

通过调用 repo 的代码,您使用的UnitOfWork是块内部using。不知道它的内部结构,但我猜想该对象管理会话生命周期,并且存在主要问题(如果不是这种情况,请纠正我),因为当您在退出后处理它时using,因此出现异常。您可能需要在某处保持会话活动的时间比此方法更长,才能使延迟加载起作用。您可能希望将 传递UnitOfWork给存储库/服务并让调用者管理其生命周期。

于 2013-11-10T16:31:10.333 回答