C# 正在忽略SetFetchMode
我有以下准则:C# 正在忽略SetFetchMode,c#,nhibernate,C#,Nhibernate,我有以下准则: session.CreateCriteria<ItemDeliveryDetail>() .SetFetchMode("ItemDelivery", FetchMode.Eager) .Add(Restrictions.Eq("Id", 21932250)) .List<ItemDeliveryDetail>(); 正如您所看到的,没有像我预期的那样加入到ITEMDELIVERY的迹象 如何修复它 ItemDe
session.CreateCriteria<ItemDeliveryDetail>()
.SetFetchMode("ItemDelivery", FetchMode.Eager)
.Add(Restrictions.Eq("Id", 21932250))
.List<ItemDeliveryDetail>();
正如您所看到的,没有像我预期的那样加入到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");
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID",
"PARTITIONDATE");
ItemDeliveryDetail
的映射如下所示:
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERY_ID")
.KeyProperty(x => x.DeliveryDate, "DELIVERY_DATE");
mapping.HasMany(x => x.ItemDeliveryDetails)
.KeyColumns.Add("ITEMDELIVERY_ID", "PARTITIONDATE");
mapping.CompositeId().KeyProperty(x => x.Id, "ITEMDELIVERYDETAIL_ID")
.KeyReference(x => x.ItemDelivery, "ITEMDELIVERY_ID",
"PARTITIONDATE");
简短回答:它不受支持 事实上,如果显式禁用
ItemDeliveryDetail.ItemDelivery
的代理行为,则会出现(NHibernate内部)无限循环并导致stackoverflow异常
编辑,长答案(部分发表在下面的评论上)
ICriteria机制不支持对复合id属性进行即时抓取。我相信您可以使用HQL使其工作(通常HQL在获取声明方面比ICriteria更强)
在映射过程中,可以像往常一样禁用代理行为(可以是流畅的,也可以是xml或注释等)
我记得我尽了最大努力让它在NH2上工作(但失败得很惨),据我所知,NH3中的相关代码没有得到改进/更改
另外,我已经在NH工作4年了。尽管它可能很好,但它有无数不明显的东西。只要看看源代码如果取消限制会发生什么?只是为了验证一个理论,助教。您还可以发布
ItemDelivery
和ItemDeliveryDetail
之间的映射您是否尝试在这两个实体之间进行连接?它应该做你想做的。@Rippo:取消限制不会改变它。生成的SQL与问题中的SQL类似,只是没有WHERE
子句。有关详细信息,请参阅更新mappings@MicheleLepri:你在谈论什么样的加入?@daniel hilgarth类似这样的东西(加入可以根据你的实际需要进行更改):var crit1=session.CreateCriteria();crit1.CreateCriteria(“ItemDelivery”,JoinType.LeftOuterJoin);var ris=crit1.Add(Restrictions.Eq(“Id”,21932250)).List()对不起,我完全不明白你的答案。什么是不受支持的?渴望吸引?这显然不是事实。我在哪里可以显式禁用代理行为?ICriteria机制不支持对复合id属性进行即时抓取。我相信您可以使用HQL使其工作。可以像往常一样禁用代理行为,因为映射过程(可以是流畅的,也可以是xml或注释等)使其更清晰。一般来说,我不想只为一个查询禁用ItemDelivery
的代理行为。这就是为什么我使用了SetFetchMode
。这并不重要。我先发制人地警告过您关于无限循环的情况,以防您使用HQL而不是Criteria API作为“最终解决方案”来完成这个任务。非常感谢你的提示!