发布
社区首页 >问答首页 >nHibernate查询异常:不存在具有给定标识符的行

nHibernate查询异常:不存在具有给定标识符的行
EN

Stack Overflow用户
提问于 2011-10-06 12:48:54
回答 1查看 2.3K关注 0票数 2

在稍微修改数据模型之后,某些查询开始给出这个异常。然而,即使在阅读了各种论坛帖子和博客之后,我也不明白为什么在我的情况下会发生这种情况。所以我希望这里有人能帮忙。首先,一个示例查询:

代码语言:javascript
代码运行次数:0
复制
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:

代码语言:javascript
代码运行次数:0
复制
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

修正模型。原始制图:

代码语言:javascript
代码运行次数:0
复制
References(d => d.PublicProperty, "PublicPropertyId").Cascade.SaveUpdate();

新制图:

代码语言:javascript
代码运行次数:0
复制
HasManyToMany(d => d.PublicPropertys)
            .Access.CamelCaseField(Prefix.Underscore)
            .Table("SomeEntityPublicProperty")
            .ParentKeyColumn("SomeEntityId")
            .ChildKeyColumn("PublicPropertyId")
            .Cascade.SaveUpdate()
            .Inverse();

UPDATE3

代码语言:javascript
代码运行次数:0
复制
HasMany<PrivatePropertyEntity>(Reveal.Member<SomeEntity>("_PrivateProperty"))
            .Table("SomeEntity_PrivateProperty")
            .KeyColumn("SomeEntityId")
            .Cascade.AllDeleteOrphan()
            .LazyLoad().Inverse();
EN

回答 1

Stack Overflow用户

发布于 2011-10-26 04:43:42

您的问题可能源于这样一个事实:如果您使用create别名(没有指定外部连接类型),那么不管您的配置是什么,实体都不会被急切地加载。

造成这种情况的原因与您的错误有关:假设您没有在关联的RHS上指定任何标准,并且您的数据中有空引用,那么使用内部连接将错误地过滤掉LHS上的记录。

因此,对于NHibernate来说,查询使用内部联接返回两个结果并不重要--无论如何,它会继续加载关联。在某个地方,您可以在多到多联接表中引用一个不存在的引用属性,当它试图延迟加载它以检查RHS是否与您的标准匹配时,它就失败了。

将别名更改为执行左外部联接可以防止错误(它实际上将急切地加载相关实体,而不会重新检查引用),但在某个地方仍然存在引用完整性问题:

代码语言:javascript
代码运行次数:0
复制
criteria.CreateAlias("PublicProperty", "alias", JoinType.LeftOuterJoin);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7674436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档