Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# NHibernate:使用带有一对一映射的createSQLQuery会导致额外的查询_C#_Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# NHibernate:使用带有一对一映射的createSQLQuery会导致额外的查询

C# NHibernate:使用带有一对一映射的createSQLQuery会导致额外的查询,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我在查询中使用以下代码 var query = session.CreateSQLQuery(sqlQuery) .AddEntity("g", typeof(AllegroGoalContract)) .AddJoin("gd", "g.GoalDetail") .SetInt32("max", max.Value) .SetGuid("callerId", ServerContext.Current.TeamMemberUniqueId) .SetIn

我在查询中使用以下代码

var query = session.CreateSQLQuery(sqlQuery)
    .AddEntity("g", typeof(AllegroGoalContract))
    .AddJoin("gd", "g.GoalDetail")
    .SetInt32("max", max.Value)
    .SetGuid("callerId", ServerContext.Current.TeamMemberUniqueId)
    .SetInt32("ver", lastChange);
它正在使用以下映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="Methodology" >
    <class name="SixDisciplines.AllegroGoalContract, SixDisciplines" table="Goal" lazy="false">
        .
        .
        <one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false"/>
        .
        .
    </class>
</hibernate-mapping>
现在,我的sql查询返回所有AllegroGoalContract实例以及GoalDetail一对一关联。请注意,一对一关联的映射具有constraint=“false”集,表示不必为每个AllegroGoalContract都设置一个goaldeail

当我运行这段代码时,我看到我的查询正在运行,但随后我看到nhibernate为每个AllegroGoalContract实例发出了一个单独的查询,其中我的查询为GoalDetail返回null。我怀疑这是因为nhibernate不知道是因为它是延迟加载还是因为它确实不存在而返回null


因此,我如何告诉nhibernate,对GoalDetails的CreateSQLQuery调用中的null实际上意味着它们不在那里,所以不要再尝试获取它们。

nhibernate映射节点-
有一个名为fetch的属性,默认值是-select,它为每个附加实体进行单独的查询。 如果希望NHibernate使用SQL连接,请更改为-

<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false" fetch="join" outer-join="true"/>


我尝试使用fetch=“join”命令,但它对如何解释CreateSQLQuery调用的结果没有任何影响。它仍然会发出单独的添加查询。请尝试将“outer join=“true”添加到“”映射。结果仍然与以前相同。为什么要在CreateSQLQuery中创建另一个连接?您是指.AddJoin(“gd”,“g.GoalDetail”)?我使用它来填充由SQL返回的AllegroGoalContract GoalDetail关联。我是否应该使用不同的CreateSQLQuery语法来代替AddJoin?为什么要使用CreateSQLQuery?因为这是一个使用SQL Server特定功能的复杂查询。因此,上面的查询中未显示的内容?是的。我没有详细介绍SQL查询,因为它对CreateSQLQuery的使用没有意义。
<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false" fetch="join" outer-join="true"/>