Я нашел множество постов с очень похожими проблемами, как у меня, но все они, похоже, используют метод DeleteObject()
, который, кажется, не существует в версии EF, которую я использую! (хотя это более чем вероятно, я смотрю в неправильных местах)
Во всяком случае, моя проблема. У меня есть два класса, User
и Email
, где у пользователя может быть много писем. У меня есть форма для редактирования, которая, к счастью, позволит мне редактировать все адреса электронной почты, прикрепленные к каждому пользователю. Я хотел бы разрешить удаление каждого адреса электронной почты, просто очистив текстовое поле в форме редактирования (это будет сделано с помощью функции JavaScript, вызываемой кнопкой удаления, связанной с каждым полем позже). С этой целью, когда данные отправляются обратно, я перебираю все адреса электронной почты и проверяю, имеет ли свойство address значение null, после чего я хочу полностью удалить этот объект Email
. Ниже мой контроллер редактирования, который (не) занимается бизнесом:
[HttpPost]
public ActionResult Edit(int id, User User)
{
try
{
foreach (Email Email in User.Emails)
{
if (Email.Address == null)
{
User.Emails.Remove(Email);
}
else
{
db.Entry(Email).State = EntityState.Modified;
}
}
db.Entry(User).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return RedirectToAction("Index");
}
}
Это работает до некоторой степени, используя отладчик, я могу видеть, что он довольно удачно удаляет объект Email
из User
, но как только он это сделает, однажды он выдаст исключение, когда попытается повторить цикл снова:
Message=Collection was modified; enumeration operation may not execute.
мой вопрос: каков правильный метод удаления объекта Email
не только из User
, но и из моей базы данных тоже?
Заранее спасибо; -)
EDIT:
Я изменил свой контроллер, чтобы создать два списка, один для Emails
с адресом и, а другой для тех, где адрес нулевой, и вместо этого перебрать их:
[HttpPost]
public ActionResult Edit(int id, User User)
{
try
{
var notNullEmails = User.Emails.Where(e => e.Address != null).ToList();
foreach (Email Email in notNullEmails)
{
db.Entry(Email).State = EntityState.Modified;
}
var isNullEmails = User.Emails.Where(e => e.Address == null).ToList();
foreach (Email Email in isNullEmails)
{
db.Emails.Remove(Email);
}
db.Entry(User).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return RedirectToAction("Index");
}
}
Но это привело к этому исключению:
Message=The object cannot be deleted because it was not found in the ObjectStateManager.
Таким образом, я адаптировал foreach
, используемый для нулевых адресов, для явного извлечения электронного письма, подлежащего удалению, в контекст следующим образом:
var isNullEmails = User.Emails.Where(e => e.Address == null).ToList();
foreach (Email Email in isNullEmails)
{
Email EmailToDelete = db.Emails.Find(Email.Id);
db.Emails.Remove(EmailToDelete);
}
Но это приводит к этому исключению:
Message=Value cannot be null.
Я думаю, что добираюсь туда благодаря вам, ребята, но я мог бы использовать немного больше помощи, пожалуйста: -)