2014-10-30 117 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