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在过载集合上使用过滤器)
什么是最好的/推荐的方式来处理这种情况?
我忘了提及,但我也使用NHibernate Envers,它需要映射参考。我认为我读了一些地方,我们可以处理像这样的情况,只需使用反向关系来处理孩子的保存,而不必将关系添加到父项。这样我就不需要初始化父项。我不喜欢这件事的是,如果我们忘记我们没有添加对父对象的引用,并且仍然在内存中处理实例,我们可以插入一些错误。 – 2014-10-31 13:05:11
在我看来,所以你成为用户的分页收集表单。 因为这些数据太多而无法显示它们。 因此,从孩子写入并向需要父母的工厂添加方法不会成为问题。 – user1618077 2014-10-31 22:20:37