我正在尝试根据外键过滤集合。我有两个映射的类
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/