Ленивая загрузка NHibernate не работает для моего домена? - PullRequest
1 голос
/ 24 ноября 2010

Я новичок в NHibernate, но сумел заставить все работать нормально для моего последнего проекта.Но теперь я достиг неизбежной проблемы с производительностью, когда мне нужно выйти за рамки абстракции, чтобы ее исправить.

Я создал тест на единицу, чтобы изолировать метод, который занимает много времени.Но сначала хороший обзор моей доменной модели, вероятно, является хорошей идеей:

У меня есть «PmqccForm», который является объектом, который имеет объект «Проект», который содержит имя, номер и т. Д., А также имеетОбъект «Вопросы» - это класс, который сам содержит свойства для различных объектов «Вопрос».Существует объект JobVelocityQuestion, который сам имеет ответ и некоторые другие свойства, и целый ряд похожих объектов Question.Это то, о чем я говорю, с моим PmqccForm, имеющим объект Вопросы alt text

Это часть вопросов модели: Question DOmain Model

Ключевым моментом является то, что я хочубыть в состоянии напечатать form.Questions.JobVelocityQuestion

, поскольку всегда есть ровно 1 JobVelocityQuestion для каждого PmqccForm, то же самое для всех остальных вопросов.Это свойства 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.processsed!http://rodhowarth.com/otherstorage/queries.txt - это журнал консоли.

Дело в том, что на данном этапе мне просто нужен объект формы, к актуальным вопросам можно обращаться по мере необходимости.Я думал, что NHibernate должен был сделать это?

Вот мой файл сопоставления: http://rodhowarth.com/otherstorage/hibernatemapping.txt

Может кто-нибудь намекнуть мне, что мне не хватает?или способ оптимизировать то, что я делаю по отношению к NHibernate?

Что если я сделаю вопросы коллекцией, а затем сделаю свойства циклически проходящими по этой коллекции и вернем правильные.Будет ли это лучше для оптимизации с точки зрения nhibernates?

1 Ответ

0 голосов
/ 24 ноября 2010

Просто попробуйте добавить fetch = "subselect" в файл сопоставления для компонента Questions и посмотрите, решит ли это проблему с множественным выбором в этой таблице - теперь вы должны увидеть один второй выбор вместо сотен отдельных запросов, например,

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

Подробнее см. Улучшение производительности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...