Hibernate、Nhibernate Eager Loading 不工作(忽略)
Hibernate, Nhibernate Eager Loading Not working (ignored)
全部,
使用 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; }
}
好的,我想通了。 Project.Region、Project.Country 是代理的原因是因为在加载项目地址之前我已经将项目加载到其他地方的会话中(没有预先加载 Region/Country)。
因此,之后我加载了项目地址,而 hibernate 不再获取该项目(因此忽略了我的获取策略),而是在会话中使用缓存的项目。
这可以通过在加载我的项目地址之前调用 Session.EvictAll() 来验证。
hibernate 中有没有一种方法可以显式告诉执行完全查询(不使用 Evict())?
全部,
使用 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; }
}
好的,我想通了。 Project.Region、Project.Country 是代理的原因是因为在加载项目地址之前我已经将项目加载到其他地方的会话中(没有预先加载 Region/Country)。 因此,之后我加载了项目地址,而 hibernate 不再获取该项目(因此忽略了我的获取策略),而是在会话中使用缓存的项目。 这可以通过在加载我的项目地址之前调用 Session.EvictAll() 来验证。
hibernate 中有没有一种方法可以显式告诉执行完全查询(不使用 Evict())?