NHibernate-如何正确处理代码中的一对多引用

本文关键字:一对多 引用 代码 正确处理 NHibernate- | 更新日期: 2023-09-27 18:28:33

使用NHibernate在代码端处理一对多的正确方法是什么,请记住我们的集合可能是巨大的(比如说400000个引用)

目前在我的应用程序中,我用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;
        } 
    }
}

这非常有效,可以确保我会话中引用的实体始终正确,问题是当我的集合没有初始化并设置为lazylod时,nhibernate将初始化整个集合,只是为了添加或删除我的实体,在某些情况下导致性能差(主要是在lazyload集合上使用过滤器时)

处理此类案件的最佳/推荐方式是什么?

NHibernate-如何正确处理代码中的一对多引用

您可以从类中删除此集合引用。如果您需要集合中的某个对象,您可以通过查询存储库中的表集合(通过集合中对象的id或基类的id)来获得该对象(或几个对象)。添加和删除方法可以由存储库执行。