Breeze Query работает медленно, но вызовы Ajax выполняются быстро

У меня есть одностраничное приложение с репозиторием и единицей работы. Реализация аналогична реализации проекта Временный найм. Я загружаю свои метаданные в shell.js. Моя единица работы и репозиторий находятся в разных проектах и ​​упоминаются в моем проекте. Кроме того, моя единица работы использует EFContextProvider для получения данных.

Однако мои запросы выполняются очень медленно. Запросы Breeze очень медленные (и очень часто время ожидания истекает). Запрос типа unitofwork.objectname.fetch() (где выборка данных из пути, controllername/Actionname) займет много времени. Однако мой запрос ajax выполняется быстро. Если я сделаю тот же вызов того же действия controllername/Actionname, ответ будет очень быстрым.

Не уверен, что предоставил достаточно информации (поскольку не знаю, где искать проблему), но при необходимости уточню.


person jpo    schedule 01.05.2014    source источник


Ответы (1)


Сначала проверьте и убедитесь, что метаданные извлекаются только один раз. Это должно произойти непосредственно перед выполнением первого запроса. Если вы видите, что он извлекается снова и снова, значит, в вашем приложении происходит что-то еще. На SO есть несколько других сообщений, где люди непреднамеренно сделали это.

Таким образом, сеть заключается в том, что ваш ПЕРВЫЙ запрос в любом EntityManager может быть медленным, потому что он выполняет запрос метаданных, за которым следует запрос данных, но каждый второй запрос после этой точки должен быть довольно быстрым.

person Jay Traband    schedule 01.05.2014
comment
Первый запрос также может быть медленным, пока веб-API и EF раскручиваются. Но если он постоянно медленный, вы должны открыть вкладку сети в инструментах браузера (или Fiddler) и посмотреть, что течет по проводу. Много запросов? Ожидаемое число? Ровно один запрос метаданных или несколько? И сколько сущностей вы возвращаете в запросе, кстати? - person Ward; 02.05.2014
comment
manager.fetchMetadata() выдаст вам ошибку (что-то вроде не может сделать это дважды), если вы будете вызывать ее снова и снова :) - person Didar_Uranov; 02.05.2014
comment
@ Didar_Uranov нет, если, как многие, вы каждый раз запускаете новый EntityManager. Каждый менеджер — это отдельный мир со своим собственным хранилищем метаданных, если только вы не решите иначе (как обычно) с чем-то вроде em2 = em.createEmptyCopy(). - person Ward; 02.05.2014