稍微修改了datamodel后,某些查询开始给我这个异常。但是,即使阅读了各种论坛主题和博客之后,我也不明白为什么会出现这种情况。所以我希望这里的某个人能够提供帮助。首先,例如查询:nHibernate查询异常:没有给定标识符的行
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为公共财产查询,一切工作正常。
私有财产通常是懒惰地加载,但在这种情况下,我想加载它与其父实体一起对抗选择N + 1。
那么,为什么它不像上面显示的那样工作,并且当我删除查询的某些部分时它工作?
UPDATE
生成的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
当SQL Server Management Studio中运行,它按预期工作。我得到两个结果。在修改数据模型和查询之间,数据库中的数据没有改变。
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();
生成的SQL看起来如何? – Firo
您从未告诉我们您对数据模型进行了哪些更改。它与id数据类型有关吗? – dotjoe
对不起,你是对的。我将'PublicProperty'从一对一修改为多对多(即引用 - >流利中的HasManyToMany)。该属性曾经是'SomeEntity'中定义的外键,但现在我有一个包含两者之间关系的附加表。 – Pieter