2014-10-30 54 views
1

在NHibernate中處理代碼端的一對多的正確方法是什麼?請記住我們的集合可能很大(可以說400 000引用)NHibernate - 如何正確處理代碼中的一對多引用

目前在我的申請,我處理他們的ISet這樣:

public class Questionnaire: BaseDatabaseModel{ 
    public Questionnaire() 
    { 
     _questions = new HashSet<Question>() 
    } 

    private readonly ISet<Question> _questions; 
    public virtual IEnumerable<Question> Questions{ 
     get{return _questions;} 
    } 

    public virtual void AddQuestion(Question q){ 
     if(_questions.Add(q)){ 
      q.Questionnaire = this; 
     } 
    } 

    public virtual void RemoveQuestion(Question q){ 
     if(_questions.Remove(q)){ 
      q.Questionnaire = null; 
     } 
    } 
} 

public class Question: BaseDatabaseModel{ 

    private Questionnaire _questionnaire; 
    public virtual Questionnaire Questionnaire { 
     get{ 
      return _questionnaire; 
     } 
     set{ 

      if (_questionnaire.IsNotNull() && _questionnaire != value) 
      { 
       // remove previous reference since it changed 
       _questionnaire.RemoveQuestion(this); 
      } 

      if (value.IsNotNull()) 
      { 
       // Add new reference if not null 
       value.AddQuestion(this); 
      } 

      // Set value 
      _questionnaire = value; 
     } 
    } 
} 

這個偉大的工程,以確保實體在我的會話引用總是正確的,問題是,當我的收藏是未初始化並設置爲lazyload,nhibernate會初始化整個集合以添加或刪除我的實體,導致某些情況下性能較差(主要是wh en在過載集合上使用過濾器)

什麼是最好的/推薦的方式來處理這種情況?

回答

0

您可以從班級中刪除此集合以便收集。 如果您需要集合中的某個對象,您可以通過從存儲庫查詢表集合(通過集合中的對象的id或基類的id)來獲取該對象(或幾個對象)。 添加和刪除方法可以由存儲庫執行。

+0

我忘了提及,但我也使用NHibernate Envers,它需要映射參考。我認爲我讀了一些地方,我們可以處理像這樣的情況,只需使用反向關係來處理孩子的保存,而不必將關係添加到父項。這樣我就不需要初始化父項。我不喜歡這件事的是,如果我們忘記我們沒有添加對父對象的引用,並且仍然在內存中處理實例,我們可以插入一些錯誤。 – 2014-10-31 13:05:11

+0

在我看來,所以你成爲用戶的分頁收集表單。 因爲這些數據太多而無法顯示它們。 因此,從孩子寫入並向需要父母的工廠添加方法不會成爲問題。 – user1618077 2014-10-31 22:20:37

相關問題