C# 选择N+1的NHibernate查询解决方案

C# 选择N+1的NHibernate查询解决方案,c#,nhibernate,nhibernate-mapping,queryover,C#,Nhibernate,Nhibernate Mapping,Queryover,我的多对多xml映射有问题。最近我在使用NHibernate Profiler时发现了这个选择N+1问题。我似乎找不到一个有效的解决方案,也不知道我的映射是否良好或与查询相关 场景:我有一个配置文件,可以有多个预定义的标记。标记可以有父项和/或子项。这些标记可以在许多配置文件中使用。我将向您展示我的相关类和映射 Account.cs Profile.cs ProfileTag.hbm.xml Tag.cs Tag.hbm.xml 当我查询任何帐户时,我看到他分别选择了所有标签。我怎样才能防止这种

我的多对多xml映射有问题。最近我在使用NHibernate Profiler时发现了这个选择N+1问题。我似乎找不到一个有效的解决方案,也不知道我的映射是否良好或与查询相关

场景:我有一个配置文件,可以有多个预定义的标记。标记可以有父项和/或子项。这些标记可以在许多配置文件中使用。我将向您展示我的相关类和映射

Account.cs

Profile.cs

ProfileTag.hbm.xml

Tag.cs

Tag.hbm.xml

当我查询任何帐户时,我看到他分别选择了所有标签。我怎样才能防止这种情况?我尝试使用JoinAlias,但没有任何区别

我的映射对父母/孩子合适吗


感谢您的帮助!Thx

在Tag.hbm.xml中将批量大小添加到袋子中起作用

<bag name="Children" table="Tags" cascade="all" inverse="true" batch-size="25">
  <key column="IdParent" not-null="true"/>
  <one-to-many class="Agrolink.Application.Models.Tag"  />
</bag>

将批次大小添加到Tag.hbm.xml中的包中起作用

<bag name="Children" table="Tags" cascade="all" inverse="true" batch-size="25">
  <key column="IdParent" not-null="true"/>
  <one-to-many class="Agrolink.Application.Models.Tag"  />
</bag>

是的,我最喜欢的解决方案。有关该功能的更多信息,我已在中编写了详细的说明。顺便说一下,你可以接受自己的答案。是的,我最喜欢的解决方案。有关该功能的更多信息,我已在中编写了详细的说明。顺便说一下,你可以接受你自己的答案。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Agrolink.Application.Models" assembly="Agrolink.Application">
<class name="Agrolink.Application.Models.Profile" lazy="false" table="Profiles" >

<id name="Id" column="Id"  >
  <generator class="identity" />
</id>

<bag name="Tags" table="ProfileTags" cascade="all-delete-orphan" inverse="true">
  <key column="IdProfile" not-null="true"/>
  <one-to-many class="Agrolink.Application.Models.ProfileTag"  />
</bag>

</class>
</hibernate-mapping>
public class ProfileTag
{
    public int Id { get; set; }

    public Profile Profile { get; set; }

    public Tag Tag { get; set; }
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Agrolink.Application.Models" assembly="Agrolink.Application">
<class name="Agrolink.Application.Models.ProfileTag" lazy="false" table="ProfileTags" >

<id name="Id" column="Id"  >
  <generator class="identity" />
</id>

<many-to-one name="Profile" class="Agrolink.Application.Models.Profile" column="IdProfile" cascade="save-update" />
<many-to-one name="Tag" class="Agrolink.Application.Models.Tag" column="IdTag" cascade="none" />

</class>
</hibernate-mapping>
public class Tag
{
    public int Id { get; set; }

    public Tag Parent { get; set; }

    public IList<Tag> Children { get; set; }
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Agrolink.Application.Models" assembly="Agrolink.Application">
<class name="Agrolink.Application.Models.Tag" lazy="false" table="Tags">

<id name="Id" column="Id"  >
  <generator class="identity" />
</id>

<property name="Name" column="Name" />
<property name="Type"  type="Agrolink.Application.Models.TagType, Agrolink.Application"  column="IdType" />

<many-to-one name="Parent" class="Agrolink.Application.Models.Tag" column="IdParent" cascade="none" />

<bag name="Children" table="Tags" cascade="all" inverse="true">
  <key column="IdParent" not-null="true"/>
  <one-to-many class="Agrolink.Application.Models.Tag"  />
</bag>

</class>
</hibernate-mapping>
<bag name="Children" table="Tags" cascade="all" inverse="true" batch-size="25">
  <key column="IdParent" not-null="true"/>
  <one-to-many class="Agrolink.Application.Models.Tag"  />
</bag>