所有
使用nhibernate 5.x,asp.net 4.6.1
我有以下关联:
项目地址=>项目=>区域
我想查询项目地址并急切地加载项目和项目区域(以及项目所在的国家/地区),...项目急切加载但项目区域不是!当我在调试器中检查时,项目上的Region是代理类型。我尝试了各种查询但没有成功:
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 =&gt; Region)。我的映射:
[ManyToOne(Column = "region_id",
ClassType = typeof(Region),
NotNull = false)]
public virtual Region Region
{
get { return _region; }
set { _region = value; }
}
答案 0 :(得分:0)
好的,我发现了问题。 Project.Region,Project.Country是代理的原因是因为在加载项目地址之前我已经将项目加载到其他地方的会话中(没有急切加载Region / Country)。 所以,之后我加载了项目地址,而hibernate没有再次获取项目(因此忽略了我的获取策略),而是在会话中使用了缓存的Project。 这可以通过在加载项目地址之前调用Session.EvictAll()来验证。
hibernate中有没有办法明确告诉执行完全查询(不使用Evict())?