0

Я пишу приложение asp.net mvc, чтобы изучить Entity Framework, и я столкнулся с проблемой, с которой я не знаю, как обращаться. Для простоты позволяет принимать следующую структуру таблицы:Entity Framework - объединение нулей - NullReferenceException не обрабатывается кодом пользователя

Movie 
ID (int, not null, auto increment) 
Name (varchar) 
GenreID (int) 

и

Genre 
ID (int, not null, auto increment) 
Name (varchar) 

Movie.GenreID является ссылкой FK для Genre.ID

Я принес во всех таблицах с помощью визуального дизайнер в VS 2008 и попробовал следующий запрос Linq:

IEnumerable<Movie> movieList = from f in dataContext.MovieSet.Include("Genre").ToList(); 

Я могу вывести данные в целях, используя:

<%= Html.Encode(movieList.Genre.Name) %> 

Все работает прекрасно, пока я не элемент в таблице Movie с нулевой GenreID. Есть ли что-то, что я могу сделать для этого запроса, чтобы он все еще мог выводить (просто оставьте его пустым, если применимо), или я делаю что-то ужасно неправильно?

ответ

0

Это, вероятно, гораздо более удобным для чтения, чем .Include("")

from f in dataContext.MovieSet 
select new 
    { 
     Name = f.Name, 
     Genre = f.Genre // This effectively performs a join. 
     ... 
    } 

Вы также можете проверить проблему таким образом:

from f in dataContext.MovieSet 
select new 
    { 
     Name = f.Name, 
     GenreName = f.Genre == null ? "" : f.Genre.Name 
     ... 
    } 

Это дает вам больше гибкости, например:

from f in dataContext.Genres 
select new 
    { 
     Name = f.Name 
     Movies = from movie in f.Movies 
       where movie.Duration > 240 
       select movied 
    } 
+0

Это очень полезно, поскольку я новичок как в Linq, так и в EF. Есть ли способ сделать запрос, подобный тем, которые вы разместили выше, которые либо возвращаются, либо могут быть отправлены в строго типизированные классы, которые были созданы, когда я импортировал схему таблицы в EF? – mynameiscoffey

+0

В ответ на ваш второй пример, я также получить тот же эффект, если бы я изменить «выбрать новый» раздел для: выбрать новый { п, Genre = (f.Genre == NULL)? new Жанр(): f.Genre } но я все еще сталкиваюсь с проблемой выбора типов выше. Еще раз спасибо за ваш ответ - я очень ценю примеры, которые вы мне дали. – mynameiscoffey

+0

Вы можете вернуть строго типизированные классы. Единственное, что вам нужно иметь в виду, это то, что Linq не поддерживает конструкторы, которые принимают параметры. Вместо этого используйте синтаксис инициализатора объекта: 'select new Movie {Name = f.Name, GenreName = f.Genre == null? "": g.Genre.Name}; ' –

1

Проблема в том, что movieList.Genre имеет значение null, и вы не можете получить доступ к объекту Name объекта null.

Вы можете решить это, написав <%= Html.Encode(movieList.Genre == null ? String.Empty : movieList.Genre.Name) %>.

Если вы не хотите, чтобы ваши представления были настолько подробными, вы можете добавить свойство GenreName в класс сущностей Movie и перенести нулевую проверку там.

+0

Интересно, что он оставляет объект нулевым (поэтому не позволяет любому из его свойств быть acce ssed). Я бы предположил, что все методы будут доступны только в их значениях. (как будто я ввел «select m. *, g.Name as GenreName из фильмов m left join genres g на g.ID = m.GenreID» и возвратил набор записей, которые я все еще мог бы вызвать GenreName и получить нулевой ответ, не исключение, что соединение не состоялось) Это устраняет ошибку, но я надеялся избежать каких-либо проверок в представлениях. – mynameiscoffey

+0

Я согласен с тем, что синтаксис «movieList.Genre.Name» очень многословный, но я могу думать о причинах, по которым я могу захотеть иметь такую ​​возможность в будущем (хотя, очевидно, в этом примере нет реальной необходимости, чтобы узнать, что может сделать все EF/Linq). Я заметил, что если после того, как я сделаю звонок, чтобы получить свой запрос, если я добавлю «if (movie.Genre == null) movie.Genre = new Genre();» до того, как я верну свой объект фильма, он ведет себя точно так же, как я надеялся. Есть ли способ обойти необходимость делать проверку на то, что каждое свойство является нулевым? – mynameiscoffey