0

我有一个模型类,其中包含一些图像和一些功能:

public class Model
{
    public int ModelId { get; set; }
    public string ModelName { get; set; }
    public virtual IList<Feature> ModelFeatures { get; set; }
    public virtual IList<ModelImage> ModelImages { get; set; }
}

public class ModelImage
{
    public virtual int ModelImageId { get; set; }
    public virtual Model Model { get; set; }
    public virtual Resource Image { get; set; }
    public virtual int DisplayOrder { get; set; }
}

public class Feature
{
    public virtual int FeatureId { get; set; }
    public virtual string Title { get; set; }
    public virtual string Text { get; set; }
}

现在我想急切地加载模型的模型图像和特征,我正在使用:

item = session.CreateCriteria<Model>()
       .Add(NHibernate.Criterion.Expression.Where<Model>(o => o.ModelId == id))
       .SetFetchMode("ModelImages", NHibernate.FetchMode.Eager)
       .SetFetchMode("ModelImages.Image", NHibernate.FetchMode.Eager)
       .SetFetchMode("ModelFeatures", NHibernate.FetchMode.Eager)
       .SetResultTransformer(NHibernate.Transform.Transformers.DistinctRootEntity)
       .UniqueResult<Model>();

但结果包含重复的 ModelImage 和 ModelFeatures,我如何将结果转换器(如 DistinctRoot)应用于这些子集合?

谢谢

4

2 回答 2

0

谢谢埃里克,

在 NHibernate 中没有标准的方法来做到这一点真的很烦人。或者我有设计问题?无论如何,我还记得为了避免重复的实体,我们可以在映射中使用 Set 而不是 Bag。

所以我改变了:

<bag name="ModelImages" table="ModelImages" cascade="all-delete-orphan" inverse="true">
  <key column="ModelId"/>
  <one-to-many class="ModelImage"/>
</bag>

<set name="ModelImages" table="ModelImages" cascade="all-delete-orphan" inverse="true">
  <key column="ModelId"/>
  <one-to-many class="ModelImage"/>
</set>
于 2011-05-07T16:35:03.930 回答
0

我会将查询分为两部分:

item = session.CreateCriteria<Model>()
   .Add(NHibernate.Criterion.Expression.Where<Model>(o => o.ModelId == id))
   .SetFetchMode("ModelFeatures", NHibernate.FetchMode.Eager)
   .UniqueResult<Model>();

session.CreateCriteria<Model>()
   .Add(NHibernate.Criterion.Expression.Where<Model>(o => o.ModelId == id))
   .SetFetchMode("ModelImages", NHibernate.FetchMode.Eager)
   .SetFetchMode("ModelImages.Image", NHibernate.FetchMode.Eager)
   .UniqueResult<Model>();

第二个查询只是继续填充从第一个查询返回的“item”对象的集合,因此不需要使用第二个查询的返回值。

如果您希望这两个查询在一次往返中执行,您可以使用 Future() 而不是 UniqueResult(),然后使用 item.Value 实际执行查询。

于 2011-05-07T11:23:57.580 回答