代码之家  ›  专栏  ›  技术社区  ›  RodH257

NHibernate惰性加载似乎不适用于我的域?

  •  1
  • RodH257  · 技术社区  · 15 年前

    我创建了一个nunit测试来隔离需要很长时间的方法。但首先快速概述我的域模型可能是个好主意:

    这就是我所说的PmqccForm有一个问题对象 alt text

    这是模型的问题部分: Question DOmain Model

    关键是我想能够打字

    由于每个PmqccForm始终只有一个JobVelocity问题,因此所有其他问题都是一样的。这些是问题对象上的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的角度来看,这是更好的优化吗?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Denis Ivin    15 年前

    只需尝试将fetch=“subselect”添加到问题组件的映射文件中,并查看这是否解决了该表的多个选择的问题-您现在应该看到一个第二个选择,而不是数百个单独的查询,例如。

    <component name="Questions" insert="true" update="true" class="PmqccDomain.DomainObjects.Questions" fetch="subselect">
    

    有关更多信息,请参阅- Improving performance

    推荐文章