【问题标题】:Hibernate, Nhibernate Eager Loading Not working (ignored)Hibernate, Nhibernate Eager Loading 不工作(忽略)
【发布时间】:2018-11-16 09:26:28
【问题描述】:

全部,

使用 nhibernate 5.x、asp.net 4.6.1

我有以下关联:

项目地址 => 项目 => 地区

我想查询项目地址并热切加载项目和项目区域(以及项目所在的国家/地区),...项目已热切加载但项目区域没有!当我在调试器中检查时,项目上的区域是代理类型。我尝试了各种查询但没有成功:

 var address = session.CreateCriteria<ProjectAddress>()
                .Add(Expression.Eq(Projections.Id(), addressId))
                .SetFetchMode("Project", NHibernate.FetchMode.Join)
                .SetFetchMode("Project.Region", NHibernate.FetchMode.Join)
                .SetFetchMode("Project.Country", NHibernate.FetchMode.Join)
                .UniqueResult<ProjectAddress>();

var address = session.Session.Query<ProjectAddress>()
                .Where(x => x.Id == addressId)
                .Fetch(x => x.Project)
                .ThenFetch(p => p.Region)
                .ThenFetch(p => p.Country)
                .Single();

我已经在其他查询中做到了这一点并且它有效,为什么它在这种情况下不起作用是我无法理解的。这里的映射没有什么特别之处(Project=>Region)。我的映射:

[ManyToOne(Column = "region_id",
               ClassType = typeof(Region),
                NotNull = false)]
    public virtual Region Region
    {
        get { return _region; }
        set { _region = value; }
    }

【问题讨论】:

    标签: asp.net nhibernate nhibernate-criteria


    【解决方案1】:

    好的,我找到了问题所在。 Project.Region, Project.Country 是代理的原因是因为在加载项目地址之前,我已经将项目加载到其他地方的会话中(没有急切加载地区/国家)。 所以,在那之后我加载了项目地址,hibernate 不再获取项目(因此忽略我的获取策略),而是在会话中使用缓存的项目。 这可以通过在加载我的项目地址之前调用 Session.EvictAll() 来验证。

    hibernate 有没有办法明确告诉执行完全查询(不使用 Evict())?

    【讨论】:

    • 您看到的是预期和必需的行为。 NHibernate 总是保证会话为它已经加载的实体产生相同的对象引用(除非被驱逐)。因此,如果您先延迟加载实体,然后急切地查询它,它仍然会为您生成实体的代理。但是该代理通常已经初始化,并且不会导致任何额外的延迟加载。收到代理并不意味着急切加载尚未完成。使用NHibernateUtil.IsInitialized 进行检查。
    • “Hibernate 始终保证会话为它已经加载的实体产生相同的对象引用” - 是的,我在发现问题后回忆了这一点。为了解决我的问题,我实现了遍历对象图并急切加载所有关联的 Unproxy() 方法。然后我可以将实体保持在视图状态并正确序列化(不使用代理类)。至于关于会话和工作单元模式的第二条评论,我使用的是采用的会话/请求模型,这有时会导致这样的问题。没有错,只是要小心。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多