我是NHibernate的新手,但已经设法让我的最新项目运行良好。但是现在我已经达到了不可避免的性能问题,我需要超越抽象来解决它。
我已经创建了一个nunit测试来隔离需要很长时间的方法。但首先快速浏览一下我的域模型可能是一个好主意:
我有一个'PmqccForm',它是一个具有'Project'对象的对象,它包含Name,Number等,它还有一个'Questions'对象,该对象本身包含各种不同的属性'问题'对象。有一个JobVelocityQuestion对象本身有一个答案和一些其他属性,以及一大堆类似的Question对象。 这就是我所说的PmqccForm有一个Questions对象
这是该模型的问题部分:
关键是我希望能够打字 form.Questions.JobVelocityQuestion
因为每个PmqccForm总是有1个JobVelocityQuestion,所有其他问题都是一样的。这些是Questions对象的C#属性,它只是它们的保留位置。
现在,引起我问题的方法是:
public IEnumerable<PmqccForm> GetPmqccFormsByUser(StaffMember staffMember)
{
ISession session = NHibernateSessionManager.Instance.GetSession();
ICriteria criteria = session.CreateCriteria(typeof(PmqccForm));
criteria.CreateAlias("Project", "Project");
criteria.Add(Expression.Eq("Project.ProjectLeader", staffMember));
criteria.Add(Expression.Eq("Project.IsArchived", false));
return criteria.List<PmqccForm>();
}
从Nunit测试我的控制台看一下刚刚运行这个方法,看到有近2000个sql查询正在被处理! http://rodhowarth.com/otherstorage/queries.txt是控制台日志。
事情是,在这个阶段我只想要表单对象,实际问题可以在需要知道的基础上访问。我认为NHibernate本来可以做到这一点?这是我的映射文件: http://rodhowarth.com/otherstorage/hibernatemapping.txt
任何人都可以暗示我缺少什么吗?或者一种优化我正在做的与NHibernate相关的方法?
如果我将问题作为集合,然后使属性循环遍历此集合并返回正确的集合,该怎么办?从nhibernates的角度来看,这会更好地优化吗?
答案 0 :(得分:0)
尝试将fetch =“subselect”添加到Questions组件的映射文件中,看看这是否解决了该表的多个选择问题 - 您现在应该看到一个第二个选择而不是数百个单独的查询,例如
<component name="Questions" insert="true" update="true" class="PmqccDomain.DomainObjects.Questions" fetch="subselect">
有关详细信息,请参阅参考资料 - Improving performance