NHibernate 使用错误的表别名

标签 nhibernate fluent-nhibernate linq-to-nhibernate

我正在尝试根据外键过滤集合。我有两个映射的类

public class GroupPriceOverrideMap:ClassMap<GroupPriceOverride>
    {
        public GroupPriceOverrideMap()
        {
            CompositeId()
                .KeyReference(x => x.Service,"ServiceCode")
                .KeyReference(x => x.CustomerAssetGroup, "GroupID");

            Map(x => x.Price);

            Table("accGroupPriceOverride");
        }
    }

public class CustomerAssetGroupMap:ClassMap<CustomerAssetGroup>
    {
        public CustomerAssetGroupMap()
        {
            Id(x => x.GroupID).Unique();

            Map(x => x.Description);

            References(x => x.Customer).Column("CustomerID");

            HasMany<GroupPriceOverride>(x => x.PriceOverrides).KeyColumn("GroupID");

            Table("accCustAssetGroup");
        }
    }

我查询它使用
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup.GroupID == groupID)

然而,这是产生
SELECT this_.ServiceCode as ServiceC1_9_0_, this_.GroupID as GroupID9_0_, this_.Price as Price9_0_ FROM accGroupPriceOverride this_ WHERE customeras1_.GroupID = @p0

where 子句引用了一个不存在的表别名(customeras1)。这可能是与 customerassetgroup 交叉的别名,但没有必要执行该交叉。我确定这只是我映射中的某些内容错误,但我找不到它。我已经尝试了各种列重命名,以防两个表中 GroupID 的存在导致问题,但这并没有解决问题。有任何想法吗?

编辑
我发现如果我查询做
_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides;

然后我得到了正确的结果。我还发现,如果我保存了一个 GroupPriceOverride 然后使用 HQL 查询它,那么它不会被找到,但我仍然可以通过加载父级并查看其覆盖集合来找到该实体。
_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1

最佳答案

看起来像旧 LINQ 提供程序中的错误。你能在这里提交一个错误吗:

https://nhibernate.jira.com/secure/Dashboard.jspa

您可以通过以下方式绕过它:

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)

并让 NHibernate 找出 ID。如果您还没有该组,则可以执行以下操作:
var group = _session.Load<CustomerAssetGroup>(groupID);
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)

ISession.Load(id) 只会生成一个代理,但在您访问属性之前不会实际访问数据库(您不会这样做,因为您只是使用它来指定 ID)。

关于NHibernate 使用错误的表别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337277/

相关文章:

c# - NHibernate-无法执行查询-输入字符串的格式不正确

sql-server - 使用 NHibernate 映射 XML 数据类型

nhibernate - 如何修复错误消息。 “Remember that ordinal parameters are 1-based!”

c# - NHibernate Fluent C# 映射问题

c# - ORA-02289 :sequence does not exist

linq - NHibernate.Linq-工作如何?

c# - 获取项目索引(rownum)

nhibernate - Fluent NHibernate 共享列的组件

NHibernate Validator 未与 Fluent NHibernate 集成

c# - NHibernate 正在生成连接错误的 SQL