2012-05-28 56 views
1

我有許多子實體的頂級實體。在nhibernate中查找所有最佳實踐

現在,我想要實現FindAll()方法,在這裏我使用這個模式查詢我所有的頂層實體到List。這很好,但我隨後拿到了所有的子對象,Alert:在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"); 

     } 
+0

你可以發佈'實體'類定義隨着映射! – Baz1nga

+0

已添加更新。 – Rippo

回答

0

爲了減少select n+1問題,你需要設置batch-size

NH3.2 +設置裝載批量大小默認爲20,所以如果你可以升級,那麼我會推薦它。見here [NH-2593]

如果不能升級,如果是使用XML映射,然後做一些事情,如: - 如果你不使用XML映射,那麼請張貼的映射例子

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

。根據更新後的映射

編輯試試這個,reprofile,你會看到你的N + 1個由50

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

的幅度降低您也可以在此批量大小設置在構建會話工廠之前的配置,因此它適用於所有的集合提取。

+0

NH 3.x將**插入/更新/刪除**批量大小設置爲20,而不是加載的大小。 –

+0

感謝迭戈,已經更新了我的答案 – Rippo