SetFetchMode被忽略了
本文关键字:被忽略了 SetFetchMode | 更新日期: 2023-09-27 18:17:57
我有以下标准:
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");
简短的回答:不支持
事实上,如果你显式地禁用ItemDeliveryDetail.ItemDelivery
的代理行为,会导致(NHibernate内部)无限循环和由此产生的stackoverflow异常。
编辑,长回答(部分发表在下面的评论中)iccriteria机制不支持对Composite id属性的即时抓取。我相信你可以使用HQL(通常HQL在fetch声明上比iccriteria更强大)。
代理行为可以像往常一样在你的映射过程中被禁用(要么是流畅的,要么是xml或注释等)
我记得我尽了最大的努力使它在NH2上工作(并且悲惨地失败了),据我所知,相关代码在NH3中没有得到改进/改变。
注:我已经和NH一起工作4年了。尽管它可能很好,但有许多不明显的东西。看看源码