【发布时间】: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