1

私は多くの子エンティティを持つ一番上のエンティティを持っています。

ここで、すべての上位エンティティをリストに照会してこのパターンを使用している FindAll() メソッドを実装したいと思います。それは問題ありませんが、それですべての子オブジェクトを取得します。アラート: 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 に答える