c# - 在 Entity Framework Core 中更新多对多关系
问题描述
我正在尝试使用Entity Framework Core更新ASP.NET Core MVC控制器many-to-many
中的关系。我设法让它工作以添加到关系中,但没有更新(如果我只是打开/保存实体,则会导致重复键错误)。
在以有效方式更新/插入新关系之前,如何从数据库中删除关系?
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);
}
解决方案
编写你的Edit
post 方法如下:
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 核心中更新模型的概念。
推荐阅读
- java - Java8 lambda 从 List 中删除元素并更新布尔标志值
- python - 如何查找 Python 文件使用了哪些模块
- node.js - nodejs nock http get 总是返回 503
- ios - Swift 5- Firebase- 将用户放入从 firebase 加载数据的部分
- excel - 将 Workbook.Query 粘贴到数组中而不粘贴到工作表
- python - 如何通过编码解决这个二项式方程?
- wordpress - woocommerce 用户注册后显示“欢迎”弹出窗口
- python - 为什么这里没有显示 ggplot?
- java - Cucumber Junit Runner 未显示测试用例行
- typescript - 与“any”类型相交的类型的 Typescript 泛型自动扩展为“any”类型