Fluent NHibernate ClassMap Formula中的引用父表别名?

时间:2012-02-29 22:01:16

标签: nhibernate fluent-nhibernate

是否可以在Fluent NHibernate公式中引用或重命名实体的表别名?我通常使用“this_”但遗憾的是,基于NHibernate生成的其他别名的数量,这似乎并不一致。

this.Map(x => x.IsLocked).Formula("CASE WHEN (SELECT COUNT(*) FROM dbo.Child c WHERE c.InboundDate >= BeginDate AND c.InboundDate < EndDate) > 0 THEN 1 ELSE 0 END");

这让我感到困惑,但是当我需要匹配相同名称的字段时,我遇到了麻烦,(比如“ID。”)

this.Map(x => x.IsLocked).Formula("CASE WHEN (SELECT COUNT(*) FROM dbo.Child c WHERE c.ID = ID) > 0 THEN 1 ELSE 0 END");

此处,由于IDc中的列,c.ID = ID将始终评估为true。在大多数情况下,我可以将其更改为c.ID = this_.ID,但在我的某些实体中,NHibernate不会将this_用作别名,而是使用parent1_

1 个答案:

答案 0 :(得分:2)

我完全不理解这个问题。提出的公式有什么问题/错误?

注意:NHibernate将在公式中添加所有列名,而不包含别名,该别名包含包含Forumula的实体表的别名。

注意2:最好将整个公式包装在parentesis (CASE ... END)

更新

  
    

c.ID = ID将始终评估为真

  

不,不应该因为第二个ID没有前缀而且会给出包含公式的实体表的前缀。请尝试记录生成的sql以查看。

示例:

Map(u => u.RolesCount).Formula("(SELECT COUNT(*) FROM roles r WHERE r.user_id = id)");

//results in

SELECT
    user0_.Id as Id0_0_,
    (SELECT
        COUNT(*)
    FROM
        roles r
    WHERE
        r.user_id = user0_.id) as formula0_0_
FROM
    "User" user0_
WHERE
    user0_.Id=@p0;