Прочитать все строки в ядре .net - PullRequest
0 голосов
/ 29 апреля 2018

В настоящее время я экспериментирую с ядром .NET, создавая вымышленный книжный магазин.

В базе данных у меня 3 таблицы: 1. Книги - все книги 2. Авторы - все авторы 3. BookAuthors - посредник (отношения многие ко многим) б / п Книги и авторы

Я хочу иметь возможность читать всех текущих авторов и показывать их пользователю, когда она хочет добавить новую книгу (поэтому, если данный автор существует, она может выбрать ее).

Я пытался что-то подобное в моем BookController:

        public async Task<ActionResult> Add()
    {
        var book = await _appDbContext.Books
        .Include(b => b.BookAuthors)
            .ThenInclude(a => a.Author)
        .AsNoTracking()
        .ToListAsync()

        return View(book);
    }

Однако, если я попробую это, я получу это исключение: enter image description here

Если я попробую что-то вроде:

        public async Task<ActionResult> Add()
    {
        var book = await _appDbContext.Books
        .Include(b => b.BookAuthors)
            .ThenInclude(a => a.Author)
        .AsNoTracking()
        .SingleOrDefaultAsync(m => m.BookId == 2);

        return View(book);
    }

это работает, но возвращает только одного автора (конечно:))

enter image description here

Если бы кто-нибудь мог мне немного помочь, я был бы очень благодарен. Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Для решения я использовал ViewComponent, который перечисляет всех авторов в базе данных.

  1. Создана новая папка в моем проекте под названием ViewComponents
  2. Внутри него я создал AuthorsListViewComponent.cs

    public class AuthorsListViewComponent : ViewComponent
    {
      private readonly ApplicationDbContext _appDbContext;
    
    public AuthorsListViewComponent(ApplicationDbContext appDbContext)
    {
        _appDbContext = appDbContext;
    }
    
    public async Task<IViewComponentResult> InvokeAsync()
    {
        var authorsList = await GetItemsAsync();
        return View(authorsList);
    }
    
    private Task<List<Author>> GetItemsAsync()
    {
        return _appDbContext.Authors.ToListAsync();
    }
    

    }

  3. Внутри Представления / Общий / Компоненты / AuthorsList Я создал представление @model IEnumerable

@model IEnumerable<Author>

<h2>Authors List</h2>
<div class="form-group">
    <label for="sel1">Select Author(hold ctrl / shift for multiple selection):</label>
    <select class="form-control" id="sel1" multiple>
        @foreach (var author in Model)
        {
            <option>@author.Name</option>
        }
    </select>
</div>
  1. Тогда я просто использовал ViewComponent внутри моего Add.cshtml

        @await Component.InvokeAsync("AuthorsList")
        <div class="form-group">
            <label asp-for="Description"></label>
            <textarea asp-for="Description" class="form-control" rows="10"></textarea>
            <span asp-validation-for="Description" class="text-danger"></span>
        </div>
0 голосов
/ 29 апреля 2018

В вашем представлении Razor вы ожидаете одну книгу.

Но из контроллера вы передаете список книг.

Это то, что говорит вам исключение.

Если вы хотите обработать список книг в представлении Razor, вам нужно изменить модель на List<MyBookstore.Models.Book> и повторить результат

...