NHibernate使用错误的表别名

sti*_*mms 5 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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我用它来查询它

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup.GroupID == groupID)
Run Code Online (Sandbox Code Playgroud)

然而,这是产生

SELECT this_.ServiceCode as ServiceC1_9_0_, this_.GroupID as GroupID9_0_, this_.Price as Price9_0_ FROM accGroupPriceOverride this_ WHERE customeras1_.GroupID = @p0
Run Code Online (Sandbox Code Playgroud)

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

编辑 我发现,如果我查询做

_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides;
Run Code Online (Sandbox Code Playgroud)

然后我得到了正确的结果.我还发现,如果我救了一个GroupPriceOverride,然后使用HQL那么就不会被发现,但我仍然可以通过加载父并查看其集合覆盖的找到实体查询它.

_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1
Run Code Online (Sandbox Code Playgroud)

Jam*_*acs 1

看起来像是旧 LINQ 提供程序中的错误。您可以在这里提交一个错误吗:

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

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

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)
Run Code Online (Sandbox Code Playgroud)

并让 NHibernate 找出 ID。如果您还没有该组,您可以执行以下操作:

var group = _session.Load<CustomerAssetGroup>(groupID);
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)
Run Code Online (Sandbox Code Playgroud)

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