Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在忽略SetFetchMode_C#_Nhibernate - Fatal编程技术网

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()ItemDelivery
的代理行为。这就是为什么我使用了
SetFetchMode
。这并不重要。我先发制人地警告过您关于无限循环的情况,以防您使用HQL而不是Criteria API作为“最终解决方案”来完成这个任务。非常感谢你的提示!