ASP.NET Основной MVC : удалите много-ко-многим записей перед публикацией метода редактирования

#c# #entity-framework #model-view-controller #asp.net-core-mvc #many-to-many

#c# #структура организации #модель-вид-контроллер #asp.net-ядро-mvc #многие ко многим

Вопрос:

У меня есть отношения «многие ко многим Project » и Member они реализованы с помощью join table ProjectMembers . В режиме просмотра для добавления конкретных участников проекта я использую несколько вариантов, в которых хранятся MemberId IEnumerablelt;intgt; SelectedMembers .

Все работает правильно, за исключением того, что я могу обновлять (редактировать) проект только с новыми участниками (члены, которые не были выбраны и были частью базы данных до этого, остаются нетронутыми). Мне нужна помощь в удалении существующих участников, ProjectMember которые подключены к конкретному ProjectId , перед публикацией обновленного набора участников. Я много пытался, но до сих пор ничего не получалось. Действительно, любой совет был бы признателен.

Это мой Edit метод публикации в ProjectController :

 [HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(int? id, CreateProjectViewModel viewmodel) {  Project project = _context.Project  .Single(m =gt; 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;    IListlt;ProjectMembergt; existingItems = _context.ProjectMembers  .Where(cm =gt; cm.MemberId == memberID)  .Where(cm =gt; 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 =gt; a.ProjectMembers)  .SingleOrDefault(m =gt; m.ProjectId == id);   if (project != null)  {  foreach (var projectMember in project.ProjectMembers  .Where(at =gt; viewmodel.SelectedMembers.Contains(at.MemberId)).ToList())  {  project.ProjectMembers.Remove(projectMember);  }  _context.SaveChanges();  }  

К сожалению, записи, которые следует удалить, ProjectMembers продолжают оставаться, Может ли кто-нибудь посоветовать, что следует изменить?

Ответ №1:

Понял. Очевидно, это гораздо более простой способ сделать это. Приведенный ниже код предназначен для удаления целых файлов, прежде чем можно будет передать новые:

 var project = _context.Project.Include(a =gt; a.ProjectMembers) .SingleOrDefault(m =gt; m.ProjectId == id);   foreach (var member in project.ProjectMembers.ToArray())  {  project.ProjectMembers.Remove(member);  }