NHProf генерирует предупреждение «этот оператор выполняется из представления», когда я передаю объект ViewModel на страницу просмотра ASP.NET MVC. - PullRequest
1 голос
/ 17 декабря 2010

Я только что заметил, что на одной странице моего сайта, где я передаю ViewModel на свою страницу просмотра, NHProf выдает следующее предупреждение:

Этот оператор выполняется из представления, что может привести к плохой производительности и / или хрупкому поведению.

Затем ссылки на эту страницу: http://nhprof.com/Learn/Alerts/QueriesFromViews

Моя ViewModel состоит всего из 2 свойств:

public IEnumerable<Photo> Photos { get; set; }
public Photo SelectedPhoto { get; set; }

Я назначаю фотографии этой ViewModel в моем контроллере следующим образом:

PhotoViewModel myViewModel = new PhotoViewModel();
myViewModel.Photos = entity.Photos;

My View, очевидно, наследует этот тип, и кроме вывода заголовка (который использует объект SelectedPhoto), он просто перебирает каждый из Photos, отображая некоторый контент для каждого из них.

NHProf показывает «проблемный» запрос, как находящийся там, где он извлекает коллекцию фотографий, которые я перебираю в моем представлении, хотя я не говорю явно, чтобы он отключился и получил эти записи из моего представления - я Вы передали эти записи в свойстве Photos моей ViewModel.

У меня есть другие страницы, где мне не нужно передавать ViewModel, и я просто передаю IEnumerable<Photo> в View, а затем отображаю разметку точно так же, как я делаю в проблемном представлении, и NHProf не выдает предупреждений ( как не должно быть) в этом сценарии.

Я думаю, что, возможно, это связано с отложенной загрузкой, и поскольку моя коллекция является частью ViewModel, когда я перехожу к циклу через свойство Photos в типе ViewModel, он собирается получить эти записи в этот момент?

Кто-нибудь знает, что здесь происходит? Сайт функционирует отлично, но NHProf просто видит, что он делает что-то, откуда не должен делать это!!

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

Вы не показали, как заполняется ваша коллекция Photos, но я предполагаю, что она так же проста, как viewModel.Photos = entity.Photos.Если это правильно (или что-то похожее), то вы просто присваиваете лени-загруженную коллекцию сущностей своей модели представления.

Есть несколько способов решения этой проблемы, но все они по сути одинаковы: вынеобходимо запустить загрузку вашей коллекции, прежде чем заполнять модель представления.Самый простой способ сделать это - просто прикрепить .ToArray() или эквивалент к коллекции, которую вы назначаете;это заставит принести.

1 голос
/ 17 декабря 2010

Вы правы.Это связано с отложенной загрузкой.Попробуйте загрузить фотографии с нетерпением.И проверьте их отношения.Возможно, у них есть некоторые из них с активной загрузкой, вам не нужно, или вы пытаетесь использовать связанный объект в вашем представлении.

...