Nhibernate集合集映射,以避免n+1选择和重复行与fetch连接



我有一个对象表和对象别名表。

别名只是字符串的集合:

object.Aliases

如果我像这样映射集合:

<class name="Object" table="Object" lazy="false">
    ...
    properties...
    ...
    <set name="Aliases" table="Aliases" inverse="true" lazy="false" fetch="join" >
      <key column="ObjectId" />
      <element column="Name" type="String"/>
    </set>
    ...
</class>
然后

session.CreateCriteria(typeof (T)).List<T>();

从基存储库获取所有对象,返回每个别名的副本。为什么?如何删除列表中重复的对象?

感谢大家的宝贵时间。

编辑:更新映射……这就是所有的映射。别名没有自己的类它只是一组字符串需要加载到ISet<string> Object.Aliases

当我开始使用NHibernate时,我也对此感到困惑。这就是它的工作原理。由于映射包含fetch="join",因此它在父表和子表之间使用SQL JOIN,因此父数据对于每个子表都是重复的。但是,不是过滤掉父类的额外实例,而是返回一个查询中每行有一个对象的集合。你需要表明你想要不同的对象。使用iccriteria语法,您可以将Transformers.DistinctRootEntity添加到查询中。

参见使用Criteria API从NHibernate获取不同的结果集?

对于select n+1问题,将batch-size="10"添加到映射

<set name="Aliases" batch-size="10" ...

相关内容

  • 没有找到相关文章

最新更新