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)
看起来像是旧 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)。
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |