1

我有许多子实体的顶级实体。

现在,我想实现 FindAll() 方法,在该方法中我使用此模式将所有顶级实体查询到 List。没关系,但我随后得到了我所有的子对象,警报:在 nhib 中选择 N+1。探查器。

获得所有对象后,我将它们发送到 FromMyDomainModel 方法以将值提取到我需要的 ViewModel。

   using (ITransaction transaction = session.BeginTransaction())
   {
       List<Property> data =
                   session.Query<Property>()//I don't need fetch
                   .ToList();
        transaction.Commit();
        return EntityViewModel.FromDomainModel(data);
    }

也许有更好的模式,所以请随时发布。

更新: 从映射映射代码你可以算出我的实体代码

   public PropertyMap()
        {
            Table("Property");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Version);
            Map(x => x.Created);
            Map(x => x.Updated);
            Map(x => x.Views);
           ....
            Map(x => x.Price);            
            HasMany(x => x.Photos).KeyColumn("PropertyId").Cascade.All();
        }

 public PhotoMap()
        {
            Table("Photo");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000).Not.Nullable();
            Map(x => x.ImageMimeType).Not.Nullable();
            References(x => x.Property).Column("PropertyId");

        }
4

1 回答 1

0

为了减少select n+1问题,您需要设置batch-size

NH3.2+ 默认将加载批量大小设置为 20,因此如果您可以升级,那么我会推荐它。见这里[NH-2593]

如果您无法升级并且正在使用 XML 映射,则执行以下操作:-

<bag/set/list ... batch-size='50' ..>
...
</bag/set/list>

如果您不使用 XML 映射,请发布一个映射示例。

根据您更新的映射进行编辑

试试这个并重新配置,你应该看到你的 n+1 减少了 50

HasMany(x => x.Photos).KeyColumn("PropertyId")
  .SetAttribute("batch-size", "50").Cascade.All();

您还可以在构建会话工厂之前在配置中设置此批量大小,以便它适用于所有集合获取。

于 2012-05-28T19:38:12.590 回答