在稍微修改数据模型之后,某些查询开始给出这个异常。然而,即使在阅读了各种论坛帖子和博客之后,我也不明白为什么在我的情况下会发生这种情况。所以我希望这里有人能帮忙。首先,一个示例查询:
var criteria = Session.CreateCriteria(typeof(SomeEntity));
criteria.Add(Expression.IdEq(id));
criteria.SetFetchMode("_PrivateProperty", FetchMode.Eager);
criteria.CreateAlias("PublicProperty", "alias");
criteria.Add(Expression.Eq("alias.Id", aliasId));
如果我通过删除公共属性的(1) SetFetchMode或(2) CreateAlias来修改查询,那么一切都正常。
私有属性通常是延迟加载的,但在本例中,我希望与它的父实体一起加载它,以对抗select N+1。
那么,为什么它不能像上面显示的那样工作,并且当我删除查询的某些部分时,它是否工作呢?
更新
生成的SQL:
SELECT * FROM SomeEntity this_
inner join PublicProperty alias4_ on this_.SomeEntityId=alias4_.SomeEntityId
inner join ReferencedProperty rp2_ on alias4_.RPId=rp2_.RPId
left outer join PrivateProperty v1_ on this_.SomeEntityId=v1_.SomeEntityId
WHERE this_.SomeEntityId= @p0 and rp2_.RPId= @p1
在中运行时,它将按预期工作。我得到了两个结果。在修改数据模型和查询之间,数据库中的数据没有改变。
UPDATE2
修正模型。原始制图:
References(d => d.PublicProperty, "PublicPropertyId").Cascade.SaveUpdate();
新制图:
HasManyToMany(d => d.PublicPropertys)
.Access.CamelCaseField(Prefix.Underscore)
.Table("SomeEntityPublicProperty")
.ParentKeyColumn("SomeEntityId")
.ChildKeyColumn("PublicPropertyId")
.Cascade.SaveUpdate()
.Inverse();
UPDATE3
HasMany<PrivatePropertyEntity>(Reveal.Member<SomeEntity>("_PrivateProperty"))
.Table("SomeEntity_PrivateProperty")
.KeyColumn("SomeEntityId")
.Cascade.AllDeleteOrphan()
.LazyLoad().Inverse();
发布于 2011-10-26 04:43:42
您的问题可能源于这样一个事实:如果您使用create别名(没有指定外部连接类型),那么不管您的配置是什么,实体都不会被急切地加载。
造成这种情况的原因与您的错误有关:假设您没有在关联的RHS上指定任何标准,并且您的数据中有空引用,那么使用内部连接将错误地过滤掉LHS上的记录。
因此,对于NHibernate来说,查询使用内部联接返回两个结果并不重要--无论如何,它会继续加载关联。在某个地方,您可以在多到多联接表中引用一个不存在的引用属性,当它试图延迟加载它以检查RHS是否与您的标准匹配时,它就失败了。
将别名更改为执行左外部联接可以防止错误(它实际上将急切地加载相关实体,而不会重新检查引用),但在某个地方仍然存在引用完整性问题:
criteria.CreateAlias("PublicProperty", "alias", JoinType.LeftOuterJoin);
https://stackoverflow.com/questions/7674436
复制相似问题