2010-05-12 28 views
4

我有一些對象:NHibernate的 - 渴望獲取與已填充的孩子名單列表

Public Class Person() { 
    public int Id {get;set;} 
    public IList<Account> Accounts {get;set;} 
    public string Email {get; set;} 
} 

public class Account(){ 
    public int Id {get;set;} 
    public IList<AccountPayment> Payments {get;set;} 
    public IList<Venue> Venues {get;set;} 
} 

public class AccountPayment(){ 
    public int Id {get;set;} 
    public DateTime PaymentDate {get;set;} 
    public decimal PaymentAmount {get;set;} 
} 

public class Venue(){ 
    public int Id {get;set;} 
    public string AddressLine1 {get;set;} 
    public string Postcode {get;set;} 
} 

這些類映射到MS SQL與NHibernate - 有每類數據庫的表...

我想在我的資源庫中創建一個方法GetAccounts(int PersonID),它將以最有效的方式返回一個包含所有帳戶的子集合的列表。任何人都可以給我任何指示如何做到這一點 - 我真的不想在我的映射中設置列表作爲子選擇,如果我可以幫助它...

謝謝。

+0

這篇博文解釋了一種有效的方法:http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently -with-nhibernate.aspx – 2010-05-12 13:58:08

+0

嗨迭戈,問題是我正在嘗試加載Person對象的Account屬性的子集合 - 我在嘗試執行此操作之前查看此文章,並在第二次調查時,我仍然無法看到做到這一點的方法。我錯過了什麼嗎? – Paul 2010-05-12 15:31:57

+0

此鏈接不再有效,不幸的是答案不包含任何相關信息。 – Aaronaught 2011-10-12 02:31:38

回答

0

好吧,試圖做到這一點在許多不同的方式後,我終於發現,對我來說最有效的解決方案概述這個問題:

Eager loading child collection with NHibernate

我的問題上面是這是我實際遇到的挑戰的一個極其簡化的版本,但是使用上述方法設法使db降到2 ...從我最初的實現中獲得了巨大的改進。

感謝您的幫助和指點傢伙。學習了一下...

1

如果您已按照您提到的方式將類映射到表,爲什麼不直接調用Person對象來獲取所有帳戶?當您從存儲庫中調用Person對象時,可以急切地加載帳戶。像這樣:

public Person GetById(int id) 
    { 
     using (var tx = _sessionBuilder.GetSession().BeginTransaction()) 
     { 
      // -- Lazy load way -- 
      //Person person = _sessionBuilder.GetSession().Get<Person>(id); 
      //tx.Commit(); 
      //return person; 

      // -- Eager load way --     
      Person person = _sessionBuilder.GetSession().CreateCriteria<Person>() 
        .Add(Restrictions.IdEq(id)) 
        .SetFetchMode("Accounts", FetchMode.Eager) 
        .UniqueResult<Person>(); 
      tx.Commit(); 
      return person; 
     } 
    } 
+0

理想情況下,我希望加載人對象(賬戶支付和場所)的賬戶屬性上的集合。我不認爲上述可以做到這一點? – Paul 2010-05-12 15:03:22

+0

集合的SetFetchMode(特別是當有多個集合時)它在性能方面不是一個好主意。 – 2010-05-12 15:14:45

+0

@Paul - 我不確定FetchMode.Eager是否會嵌套集合。您可以使用NHProf查看SQL。另一種急於加載的方式,可能是在原始聲明中調用存儲庫,並熱切地致電付款和場所。 .... .SetFetchMode( 「付款」,FetchMode.Eager) .SetFetchMode( 「場地」,FetchMode.Eager) .... – LordHits 2010-05-12 15:55:18