Entity Framework - объединение нулей - исключение NullReferenceException не было обработано кодом пользователя - PullRequest
0 голосов
/ 25 декабря 2009

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

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. Могу ли я что-то сделать с этим запросом, чтобы он по-прежнему мог выводиться (просто оставьте это поле пустым, когда это применимо), или я делаю что-то ужасно неправильно?

Ответы [ 2 ]

1 голос
/ 25 декабря 2009

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

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

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

0 голосов
/ 25 декабря 2009

Это, вероятно, гораздо более читабельно, чем .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
    }
...