2010-07-14 89 views
0

我有有許多一對多關係對自身的產品表(使用兩列多到多表),我已經用下面的代碼設置它在功能NHibernate:如何使用Fluent Nhibernate多對多實現最佳性能?

public class ProductConfiguration : ClassMap<Product> 
{ 
    public ProductConfiguration() 
    { 
     Table("Product"); 
     Id(p => p.Id).GeneratedBy.Guid(); 

     Map(p => p.Name).Not.Nullable().Length(254); 
     Map(p => p.Description).Not.Nullable().Length(1000); 
     Map(p => p.CreatedAt).Not.Nullable(); 

     HasManyToMany(p => p.CrossSell) 
      .Table("ProductCrossSell") 
      .ParentKeyColumn("Id") 
      .ChildKeyColumn("ProductId"); 
    } 
} 

我的MVC應用程序使用此設置兩個頁面:

  • 指數 - 使用一個通用存儲庫GETALL方法來顯示所有產品。
  • 詳細信息 - 使用通用存儲庫GetById方法在多對多關係中顯示一個產品和任何相關的交叉銷售產品設置。

它看起來像NHibernate的設置爲LazyLoad許多一對多默認情況下,所以當我火起來的應用程序和探查看着它,我可以看到,它並LazyLoad許多一對多具有以下警告「不鼓勵使用隱式事務」。

  1. 如何擺脫此警報?我找不到任何關於如何在事務中包裝LazyLoad以擺脫警報的信息。它甚至有可能嗎?
  2. 有沒有一種方法來通過告訴NHibernate不需要延遲加載,每當我要求GetById時,一定要加入表格,在一個查詢中獲取所有內容?我嘗試在多對多映射中使用.Fetch.Join(),但這也影響了我的GetAll查詢,該查詢現在顯示一個連接結果集,這也是不正確的。

對於這種簡單場景,最好的評價是什麼?

謝謝

回答

0
  1. 的方式來觸發裝載有某種形式的呼叫擺脫警告的是訪問對象圖,充分填充UI元素在一次交易中。

  2. 不按配置。您可以創建一個HQL查詢,以便提前獲取關聯並將該查詢用於特定的視圖。我會堅持延遲加載,除非需要進行優化。該HQL是:


return session.CreateQuery("from ProductionConfiguration pc join fetch pc.CrossSell where pc.Id = ?") 
    .SetGuid(0, id) 
    .List<ProductConfiguration>(); 
+0

傑米,你會說,「使用隱式的交易是不鼓勵」警報是不是在這種情況下,一個大問題?我不開始迭代通過關聯,直到視圖,所以lazyload總是會在事務範圍之外觸發​​。唯一的辦法就是像你說的那樣急於加載交易。 – Thomas 2010-07-14 21:35:15

+0

我不會爲此擔心,特別是在讀取操作中。在幾乎所有情況下,我認爲你可以放心地忽略它。畢竟這只是一個警告。 :-) – 2010-07-14 22:46:11

0

默認情況下,所有集合都在NHibernate中被延遲加載。

必須(甚至與調試器的手錶也許)

相關問題