EF Core 2.1 как обновить данные в связанной таблице - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в ядре EF и создал тестовый проект после этого урока Начало работы с EF

Это блог с некоторыми постами.

Я обновил метод Edit GET, чтобы включить в него сообщения

  public async Task<IActionResult> Edit(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var blog = await _context.Blog.Include(x => x.Post).SingleOrDefaultAsync(x => x.BlogId == id);
        if (blog == null)
        {
            return NotFound();
        }
        return View(blog);
    }

Я обновил модель, чтобы иметь возможность индексировать сообщения.

    public partial class Blog
{
    public Blog()
    {
        Post = new List<Post>();
    }

    public int BlogId { get; set; }
    public string Url { get; set; }

    public virtual IList<Post> Post { get; set; }
}

И в моем Edit.cshtml я добавил этот раздел для отображения сообщений:

  @for (int i = 0; i < Model.Post.Count; i++)
        {
            <div class="form-group">
                <label asp-for="Post[i].Title" class="control-label"></label>
                <input asp-for="Post[i].Content" class="form-control" />                    
            </div>
        }

Однако, когда я пытаюсь обновить обновленный объект Post, он просто добавляется в коллекцию, а не обновляет существующий. Это означает, что мои сообщения удваиваются каждый раз, когда я обновляю их.

Вот мой метод Edit POST. Я проверил, что значение blog содержит правильные значения в коллекции сообщений.

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, [Bind("BlogId,Url,Post")] Blog blog)
    {
        if (id != blog.BlogId)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(blog);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!BlogExists(blog.BlogId))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        return View(blog);
    }

Что я делаю не так?

1 Ответ

0 голосов
/ 30 октября 2018

Похоже, что для PostId нет скрытого поля ввода, поэтому сообщения, являющиеся частью блога в вашем действии POST, рассматриваются как новые записи и вставляются.

<div class="form-group">
        <input type="hidden" asp-for="Post[i].PostId" />
        <label asp-for="Post[i].Title" class="control-label"></label>
        <input asp-for="Post[i].Content" class="form-control" />                    
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...