NHibernate使用错误的表别名

时间:2010-12-02 16:27:28

标签: 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

1 个答案:

答案 0 :(得分: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,因此不会这样做。) / p>