Показать ICollection в представлении - PullRequest
0 голосов
/ 07 ноября 2018

Я занимаюсь разработкой проекта на ASP.NET MVC5 и использую EF6. У меня есть следующие классы с отношением один-ко-многим между Автором и Книгой, где Автор может иметь несколько Книг, а Книга может принадлежать только одному Автору:

Модели:

public class Author 
{
   public int AuthorId { get; set; }
   public string Name { get; set; }

   public ICollection<Book> Books { get; set; }
}

public class Book 
{
   public int BookId { get; set; }
   public string Name { get; set; }

   public int? AuthorId { get; set; }
   public Author Author { get; set; }
}

Я сгенерировал соответствующий контроллер с представлениями, используя EF, и теперь я хочу отобразить для каждого Автора соответствующие имена соответствующих книг в представлении Details.cshtml.

Контроллер :

// GET: Authors/Details/5
public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    Author author = await db.Authors.FindAsync(id);

    if (author == null)
    {
       return HttpNotFound();
    }
       return View(author);
}

My Details.cshtml следующим образом:

@model MyApp.Models.Author

<div>
    <h4>Author Info</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt style="font-size:20px">
            @Html.DisplayNameFor(model => model.Name)
        </dt>

        <dd style="font-size:20px">
            @Html.DisplayFor(model => model.Name)
        </dd>

        <dt style="font-size:20px">
            Associated Books
        </dt>
        @foreach (var item in Model.Books)
        {
            <dd>
                @item.Name
            </dd>
        }

    </dl>
</div>

Но это приводит к следующей ошибке:

Ссылка на объект не установлена ​​для экземпляра объекта. исключение Подробности: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.

Я следовал за ответом на этот похожий вопрос ( Как отобразить коллекцию в представлении проекта ASP.NET MVC Razor? ), но, очевидно, безуспешно. Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

0 голосов
/ 07 ноября 2018

Ваш взгляд в порядке.

Проблема в том, что EF не загружает связанные сущности по умолчанию (по соображениям производительности), поэтому свойство Books в вашем Author останется нулевым.

Вы также должны вручную указать контекст для загрузки книг, используя .Include. Например:

Author author = await db.Authors.Include(a => a.Books).SingleOrDefault(a => a.AuthorId == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...