【问题标题】:NHibernate - How to properly handle One-to-Many references in codeNHibernate - 如何正确处理代码中的一对多引用
【发布时间】:2014-10-30 17:25:05
【问题描述】:

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

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

这非常适合确保我的会话中的实体引用始终正确,问题是当我的集合未初始化并设置为延迟加载时,nhibernate 将初始化整个集合只是为了添加或删除我的实体,导致性能不佳在某些情况下(主要是在对延迟加载的集合使用过滤器时)

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

【问题讨论】:

    标签: c# nhibernate lazy-loading one-to-many lazy-initialization


    【解决方案1】:

    您可以从您的班级中删除此收藏参考。 如果您需要集合中的一些对象,您可以通过从存储库中查询表集合(通过集合中的对象 id 或基类的 id)来获取该对象(或少数对象)。 添加和删​​除方法可以由存储库执行。

    【讨论】:

    • 我忘了提,但我也在使用 NHibernate Envers,它需要映射参考。我认为我在某处读到,我们可以通过仅使用反向关系处理子级的保存来处理此类情况,而无需将关系添加到父级。这样我就不需要初始化父级。我不喜欢这样的事情是,有时我们可以插入错误,如果我们忘记我们没有添加对父级的引用并且我们仍在处理内存中的实例。
    • 在我看来,这样你就变成了用户的分页集合表单。因为这些数据太多,显示不出来。因此,从子编写并向需要父的工厂添加方法不会成为问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多