NHibernate - 带有延迟映射集合的重复记录

时间:2014-01-24 04:01:57

标签: asp.net nhibernate nhibernate-criteria

所有

我有一个实体,它有几个集合, - 每个集合都是懒惰映射的。当我运行条件查询时,我在结果集中获得了我的根实体的重复结果。当我的所有收藏品被懒惰地映射时,这怎么可能!

我验证了,我的藏品,懒洋洋地加载。

这是我的映射:

根实体'项目':

[Bag(0, Lazy = CollectionLazy.True, Inverse = true, Cascade = "all-delete-orphan")]
    [Key(1, Column = "job_id")]
    [OneToMany(2, ClassType = typeof(ProjectPlan))]
    public virtual IList<ProjectPlan> PlanList
    {
        get { return _planList; }
        set { _planList = value; }
    }

标准查询是:

    ICriteria criteria = session.Session.CreateCriteria<Entities.Project>()
                    .Add(Restrictions.Eq(Entities.Project.PROP_STATUS, !Entities.Project.STATUS_DELETED_FLAG));
                    .CreateAlias(Entities.Project.PROP_PLANLIST, "p")
                    .Add(Restrictions.Eq("p.County", 'MIDDLSEX'))
.setFirstResult(start).setMaxResults(pageSize)
                    .List<Entities.Project>();

我知道,我可以纠正这个问题w / Distinct结果转换器,我只是想知道这是否是懒惰集合的正常行为。

编辑:我找到了原因, - 在查看原始SQL,连接和where子句是正确的时候,但令我困惑的是生成的Select子句, - 它不仅包含项目实体的列(root)实体)以及项目计划实体的列,这些列导致我上面描述的问题。我现在不在工作,但我会尝试这样做:.SetProjection(Projections.RootEntity()),所以我只在select子句中获得Project的列。

1 个答案:

答案 0 :(得分:1)

一种方法,如何解决这个(我会说这么常见的情况)是:1)不使用查询内部的提取集合和2)使用批量提取,作为一部分映射

因此,我们将始终查询根实体。这将为我们提供一个平坦的结果集,可以正确用于分页

要获取每个收到的行的收集数据,并避免1 + N问题(收集每条记录的goign),我们将使用19.1.5. Using batch fetching

映射就像这样

[Bag(0, Lazy = CollectionLazy.True
      , Inverse = true
      , Cascade = "all-delete-orphan"
      , BatchSize = 25)] // Or something similar to batch-size="25"
[Key(1, Column = "job_id")]
[OneToMany(2, ClassType = typeof(ProjectPlan))]
public virtual IList<ProjectPlan> PlanList
{
   ...

其他一些类似的QA (具有几乎相同的细节)

我们仍然可以过滤而不是收藏品!但我们必须使用子查询,例如Query on HasMany reference