Редактирование 2 таблиц в одном представлении - PullRequest
0 голосов
/ 02 ноября 2019

ПРОБЛЕМА:

Проблема в том, что я не знаю, как обновить мои 2 таблицы.

мой ввод работает и передает значения в sendDefence и sendName. Но как изменить эти значения в 2 таблицах?

ОШИБКА:

DbUpdateConcurrencyException: ожидается, что операция с базой данных повлияет на 1 строку (и), но фактически повлияет на 0 строку (и),Данные могут быть изменены или удалены, так как объекты были загружены. См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма.

WebGame.Controllers.TowersController.Edit (int id, EditViewModel editViewModel) в TowersController.cs

                await _context.SaveChangesAsync();

EditViewModel.cs

 public class EditViewModel
    {
        public World World { get; set; }
        public Tower Tower { get; set; }
    }

Edit.Html

@model WebGame.ViewModel.EditViewModel
      <div class="row">
            <div class="col-md-4">
                <form asp-action="Edit">
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                    <input type="hidden" asp-for="World.WorldId" />
                    <div class="form-group">
                        <label asp-for="World.Player1Name" class="control-label"></label>
                        <input asp-for="World.Player1Name" class="form-control" />
                        <span asp-validation-for="World.Player1Name" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="Tower.Defence" class="control-label"></label>
                        <input asp-for="Tower.Defence" class="form-control" />
                        <span asp-validation-for="Tower.Defence" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <input type="submit" value="Save" class="btn btn-primary" />
                    </div>
                </form>
            </div>
        </div>

Контроллер

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, EditViewModel editViewModel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    int? sendDefence = editViewModel.Tower.Defence;
                    string sendName = editViewModel.World.Player1Name;

                    Tower tower = new Tower();
                    tower.Defence = sendDefence;
                    _context.Update(tower);

                    World world = new World();
                    world.Player1Name = sendName;
                    _context.Update(world);

                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TowerExists(editViewModel.World.WorldId))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(nameof(Index));
        }

1 Ответ

0 голосов
/ 02 ноября 2019

ваша Башня и Мир являются только новым объектом, не связанным с базой данных, и without ID data .so фактически затронули 0 строк.

    Tower tower = new Tower();
    tower.Defence = sendDefence;
    _context.Update(tower);

    World world = new World();
    world.Player1Name = sendName;
    _context.Update(world);

вы можете сначала запросить, затем обновить значение, а затем вызвать SaveChangesAsync.

    Tower tower = _context.Tower.First(w=>w.Id == editViewModel.Tower.Id);
    tower.Defence = sendDefence;
    _context.Update(tower);

    World world = _context.World.First(w=>w.Id == editViewModel.World.Id);
    world.Player1Name = sendName;
    _context.Update(world);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...