我有以下标准:
session.CreateCriteria<ItemDeliveryDetail>()
.SetFetchMode("ItemDelivery", FetchMode.Eager)
.Add(Restrictions.Eq("Id", 21932250))
.List<ItemDeliveryDetail>();
这导致以下查询:
SELECT this_.itemdeliverydetail_id AS itemdeli1_4_0_,
this_.itemdelivery_id AS itemdeli2_4_0_,
this_.partitiondate AS partitio3_4_0_,
this_.amount AS amount4_0_,
this_.processed_by_rem AS processed5_4_0_,
this_.single_item_price AS single6_4_0_,
this_.bookingaccount_id AS bookinga7_4_0_,
this_.supplierinvoice_id AS supplier8_4_0_
FROM itemdeliverydetail this_
WHERE this_.itemdeliverydetail_id = :p0;
正如您所看到的,没有像我期望的那样加入ITEMDELIVERY
的迹象。
如何解决?
ItemDelivery
的映射如下所示:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERY_ID")
.KeyProperty(x => x.DeliveryDate, "DELIVERY_DATE");
mapping.HasMany(x => x.ItemDeliveryDetails)
.KeyColumns.Add("ITEMDELIVERY_ID", "PARTITIONDATE");
ItemDeliveryDetail
的映射如下所示:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID",
"PARTITIONDATE");
答案 0 :(得分:2)
简短回答:不支持。
实际上,如果您明确禁用ItemDeliveryDetail.ItemDelivery
的代理行为,则会出现导致(NHibernate内部)无限循环和导致堆栈溢出异常的情况。
编辑,长答案(部分发布在下面的评论中) ICriteria机制不支持对复合ID属性进行急切提取。我相信你可以使用HQL(通常HQL在获取声明和ICriteria上更强)。
可以在映射过程中照常禁用代理行为(可以是流畅的,也可以是xml或注释等)
我记得我尽我所能让它在NH2上工作(并且失败了),尽管我知道相关代码在NH3中没有得到改进/改变。
P.S。我4年来一直在NH工作。很好,因为它可能存在 gazillion 的事情。看看来源