NHProf генерирует предупреждение "этот оператор выполняется из представления", когда я передаю объект ViewModel на страницу просмотра ASP.NET MVC.
Я только что заметил, что на одной странице моего сайта, где я передаю 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;
Мой вид, очевидно, наследует этот тип, и кроме вывода заголовка (который использует SelectedPhoto
объект), он просто проходит через каждый из Photos
рендеринг контента для каждого из них.
NHProf показывает "проблемный" запрос как тот, где он извлекает коллекцию фотографий, которые я просматривал в моем представлении, хотя я не говорю явно, чтобы он ушел и получил эти записи из моего представления - я прошел эти записи в Photos
собственность моей ViewModel.
У меня есть другие страницы, где мне не нужно передавать ViewModel, и я просто передаю IEnumerable<Photo>
в представление, а затем визуализируйте разметку точно так же, как я делаю в представлении проблемы, и NHProf не выдает предупреждений (как и не должно быть) в этом сценарии.
Я думаю, может быть, это связано с отложенной загрузкой, и потому что моя коллекция является частью ViewModel, когда я иду по циклу Photos
свойство внутри типа ViewModel, он идет, чтобы получить эти записи в этот момент?
Кто-нибудь знает, что здесь происходит? Сайт функционирует отлично, но NHProf просто видит, что он делает что-то, откуда не следует этого делать?!
2 ответа
Вы не показали, как ваш Photos
коллекция заполняется, но я предполагаю, что это так же просто, как viewModel.Photos = entity.Photos
, Если это правильно (или что-то похожее), то вы просто присваиваете ленивую загруженную коллекцию сущностей своей модели представления.
Есть несколько способов решения этой проблемы, но все они по сути одинаковы: вам нужно инициировать загрузку вашей коллекции, прежде чем заполнять модель представления. Самый простой способ сделать это - просто приклеить .ToArray()
или эквивалент на коллекцию, которую вы назначаете; это заставит принести.
Вы правы. Это связано с отложенной загрузкой. Попробуйте загрузить фотографии с нетерпением. И проверьте их отношения. Возможно, у них есть некоторые с загруженной загрузкой, вам не нужно, или вы пытаетесь использовать связанную сущность в своем представлении.