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");

SetFetchMode被忽略了

简短的回答:不支持

事实上,如果你显式地禁用ItemDeliveryDetail.ItemDelivery的代理行为,会导致(NHibernate内部)无限循环和由此产生的stackoverflow异常。

编辑,长回答(部分发表在下面的评论中)iccriteria机制不支持对Composite id属性的即时抓取。我相信你可以使用HQL(通常HQL在fetch声明上比iccriteria更强大)。

代理行为可以像往常一样在你的映射过程中被禁用(要么是流畅的,要么是xml或注释等)

我记得我尽了最大的努力使它在NH2上工作(并且悲惨地失败了),据我所知,相关代码在NH3中没有得到改进/改变。

注:我已经和NH一起工作4年了。尽管它可能很好,但有许多不明显的东西。看看源码