NHibernate使用了错误的表别名

NHibernate使用了错误的表别名,nhibernate,fluent-nhibernate,linq-to-nhibernate,Nhibernate,Fluent Nhibernate,Linq To Nhibernate,我正在尝试根据外键筛选集合。我有两个类,它们映射为 public class GroupPriceOverrideMap:ClassMap<GroupPriceOverride> { public GroupPriceOverrideMap() { CompositeId() .KeyReference(x => x.Service,"ServiceCode")

我正在尝试根据外键筛选集合。我有两个类,它们映射为

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");
        }
    }
where子句引用的表别名不存在(customeras1)。这可能是与customerassetgroup交叉的别名,但无需执行该交叉。我确信这只是我的映射中的某个错误,但我找不到它。我尝试过各种列重命名,以防两个表中的GroupID都会导致问题,但这并没有解决问题。有什么想法吗

编辑 我发现如果我在做什么

_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides;

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

您可以通过以下方式绕过此问题:

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)
\u session.Linq.Where(x=>x.CustomerAssetGroup==group)
让NHibernate算出ID。如果您还没有该组,您可以这样做:

var group = _session.Load<CustomerAssetGroup>(groupID);
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)
var group=\u会话加载(groupID);
_session.Linq.Where(x=>x.CustomerAssetGroup==group)

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

谢谢,James,我创建了一个单元测试来演示并打开了问题BTW-您使用的是NH2.1.2还是NH3?如果您使用的是NH3,请尝试转换为使用ISession.Query(实际上是一个扩展方法)。您的bug位于旧的LINQ提供程序中,该提供程序已被弃用。新的LINQ提供程序是一个全新的重写。2.1.2,我确信我不使用NH3是有原因的,但可能只是因为nupack没有一个流利的nhibernate for NH3(lazy)。我将试着用NH3来重建fluent,并改用它。我升级到NH3,现在我的测试完全通过了。我之所以首先使用NH2.1.2,是因为我没有意识到Linq是内置在NH3中的,所以我安装了NH.Linq包,它引入了NH2.1.2。经验教训。请注意,NH3中的LINQ提供程序是将LINQ重新写入NHibernate的基础。(L2NH是一种概念证明,非常粗糙。)因此有一些查询和构造可以使用Linq,但不能使用查询,反之亦然。NH团队计划在未来几个月加大对查询的投资。如果您真的遇到了一个无法进行查询的绑定,您可以始终使用HQL、Criteria、QueryOver(强类型条件包装器)。。。您甚至可以针对NH3重新编译Linq并使用它!
_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)
var group = _session.Load<CustomerAssetGroup>(groupID);
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group)