ASP.NET Core MVC:在发布编辑方法之前删除多对多条目
Posted
技术标签:
【中文标题】ASP.NET Core MVC:在发布编辑方法之前删除多对多条目【英文标题】:ASP.NET Core MVC : remove many-to-many entries before posting Edit method 【发布时间】:2022-01-12 16:44:11 【问题描述】:我在Project
和Member
之间有一个多对多关系,通过连接表ProjectMembers
实现。为了添加特定的项目成员,我使用多项选择将 MemberId
存储在 IEnumerable<int> SelectedMembers
中。
一切正常,除了我只能用新成员更新(编辑)项目(未选择的成员,之前是数据库的一部分保持不变)。在发布更新的成员集之前,我需要帮助删除 ProjectMember
中连接到特定 ProjectId
的现有成员。我已经尝试了很多,但到目前为止没有任何效果。真的任何建议都将不胜感激。
这是我在ProjectController
中的Edit
发布方法:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(int? id, CreateProjectViewModel viewmodel)
Project project = _context.Project
.Single(m => m.ProjectId == id);
project.Name = viewmodel.Name;
project.Budget = viewmodel.Budget;
project.BusinessCase = viewmodel.BusinessCase;
project.StartDate = viewmodel.StartDate;
project.FinishDate = viewmodel.FinishDate;
project.ClientId = viewmodel.ClientId;
// here I need the method to remove the existing instances of Member in ProjectMember
// part of code below is validation that there will be no conflict of PrimaryKeys on ProjectMember, probably can be removed once the Remove method is implemented
foreach (var selectedId in viewmodel.SelectedMembers)
var projectID = project.ProjectId;
var memberID = selectedId;
IList<ProjectMember> existingItems = _context.ProjectMembers
.Where(cm => cm.MemberId == memberID)
.Where(cm => cm.ProjectId == projectID).ToList();
if (existingItems.Count == 0)
_context.ProjectMembers.Add(new ProjectMember
ProjectId = project.ProjectId,
MemberId = selectedId,
);
_context.SaveChanges();
return RedirectToAction("Index");
更新:
基于类似的线程,我想出了以下要在新行添加到 ProjectMembers
之前添加的帖子编辑:
var project = _context.Project.Include(a => a.ProjectMembers)
.SingleOrDefault(m => m.ProjectId == id);
if (project != null)
foreach (var projectMember in project.ProjectMembers
.Where(at => viewmodel.SelectedMembers.Contains(at.MemberId)).ToList())
project.ProjectMembers.Remove(projectMember);
_context.SaveChanges();
不幸的是,ProjectMembers
中应该删除的条目继续保留,有人可以建议应该改变什么吗?
【问题讨论】:
【参考方案1】:知道了。显然是一种更简单的方法。下面的代码是在传递新的之前删除整个:
var project = _context.Project.Include(a => a.ProjectMembers)
.SingleOrDefault(m => m.ProjectId == id);
foreach (var member in project.ProjectMembers.ToArray())
project.ProjectMembers.Remove(member);
【讨论】:
以上是关于ASP.NET Core MVC:在发布编辑方法之前删除多对多条目的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 SelectListItem 无法编辑 ASP.NET Core MVC
ASP.NET Core MVC 之控制器(Controller)
使用 ASP.NET Core MVC 编辑 Cascade DropDownList
如何在 ASP.NET Core MVC 中使用 select 标签动态编辑数据库表?