Мне нужно подтверждение моего подхода для этого, я использую EF и ASP.NET MVC, и я пытаюсь удалить объекты на основе выбора пользователя (то есть на основе того, что они проверяли / не проверяли).
Для этого я смотрю на идентификаторы, которые передаются из формы из флажков, совпадают с тем, что у меня есть в базе данных, а затем сначала добавляются все новые, а затем удаляются все не соответствующие,
Ниже приведен код, который у меня изначально был:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);
if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select( c => c.Id);
foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}
foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
instancerole.rights.Remove(right);
}
db.SaveChanges();
}
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}
Однако была представлена следующая ошибка: «Сбор был изменен; операция перечисления может не выполняться».
Поэтому, чтобы попытаться решить эту проблему, я решил сохранить отдельный список и затем удалить его на основе списка, чтобы устранить ошибку:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection, VMinstanceRole vmodel)
{
try
{
var instancerole = db.instanceRoles.Find(id);
List<right> removeList = new List<right>();
if (ModelState.IsValid)
{
UpdateModel<instanceRole>(instancerole, "instanceRole");
var keys = instancerole.rights.Select( c => c.Id);
foreach (var pid in vmodel.selectedId.Except(keys))
{
var right = new right { Id = pid };
db.rights.Attach(right);
instancerole.rights.Add(right);
}
foreach (var pid in keys.Except(vmodel.selectedId))
{
var right = instancerole.rights.Where(c => c.Id == pid).Single();
removeList.Add(right);
}
foreach (var right in removeList)
{
instancerole.rights.Remove(right);
}
db.SaveChanges();
}
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch (InvalidCastException e)
{
return View();
}
}
Кажется, это работает, но я 'Я не уверен, правильно ли я поступил.Главным образом, потому что я делаю еще один цикл.Есть ли лучший способ приблизиться к этому или это достаточно хорошо?