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集合上使用过滤器时)
处理此类案件的最佳/推荐方式是什么?
您可以从类中删除此集合引用。如果您需要集合中的某个对象,您可以通过查询存储库中的表集合(通过集合中对象的id或基类的id)来获得该对象(或几个对象)。添加和删除方法可以由存储库执行。