Обновите отношение многие ко многим в Entity Framework Core - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь обновить many-to-many отношение в ASP.NET Core MVC , используя Entity Framework Core . Мне удалось заставить это работать для добавления в отношение, но не для обновления (приводит к ошибке дублированного ключа, если я просто открываю / сохраняю сущность).

Как удалить отношения из базы данных перед эффективным обновлением / вставкой новых отношений?

public async Task<IActionResult> Edit(int id, [Bind("Id,Name,SalesClerkIds")] Plant plant)
{
        if (id != plant.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                plant.SalesClerks = new List<PlantSalesClerk>();

                if (plant.SalesClerkIds != null)
                {
                    foreach (var scId in plant.SalesClerkIds)
                    {
                        plant.SalesClerks.Add(new PlantSalesClerk()
                        {
                            Plant = plant,
                            User = _context.Users.FirstOrDefault(u => u.Id == scId)
                        });
                    }
                }

                _context.Update(plant);

                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!PlantExists(plant.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }

        return View(plant);
  }

1 Ответ

0 голосов
/ 09 января 2019

Напишите ваш Edit метод записи следующим образом:

public async Task<IActionResult> Edit(int id, [Bind("Id,Name,SalesClerkIds")] Plant plant)
{
    if (id != plant.Id)
    {
        return NotFound();
    }

    if (ModelState.IsValid)
    {
        try
        {
            Plant plantToBeUpdated = await _context.Plants.Include(p => p.SalesClerks).FirstOrDefaultAsync(p => p.Id == id);

            if (plantToBeUpdated != null)
            {
                 plantToBeUpdated.SalesClerks.Clear(); // Here you have to clear the existing children before adding the new

                 if (plant.SalesClerkIds.Count > 0)
                 {
                      foreach (var scId in plant.SalesClerkIds)
                      {
                         plantToBeUpdated.SalesClerks.Add(new PlantSalesClerk()
                         {
                            PlantId = plantToBeUpdated.Id,
                            UserId = scId
                         });
                     }
                 }

                 plantToBeUpdated.Name = plant.Name;

                // Map other properties here if any

                _context.Plants.Update(plantToBeUpdated);

                await _context.SaveChangesAsync();
           }

        }
        catch (DbUpdateConcurrencyException)
        {
            if (!PlantExists(plant.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }

    return View(plant);
}

Примечание: я не видел ваши классы моделей и вид редактирования. Я предположил все на основе вашего кода. Так что может потребоваться некоторая корректировка, но это концепция обновления модели с дочерними элементами в ядре EF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...