Ошибка Entity Framework, только при удалении "множественных" родительских и дочерних строк
Я строю проект MVC и использую Entity-Framework 6 (сначала код).
Моя база данных моделей данных (сначала код):
public class ParentNode
{
public int ParentNodeId { get; set; }
public string SomeParentData { get; set; }
//FK
[Required]
public int ChildNodeId { get; set; }
public virtual ChildNode ChildNode { get; set; }
}
public class ChildNode
{
public int ChildNodeId { get; set; }
public string SomeChildishData { get; set; }
//References to this table/model
public virtual ICollection<ParentNode> ParentNodes{ get; set; }
}
Проблема: удаление нескольких дочерних узлов
- Я не буду полагаться на каскадное удаление
- ParentNode->ChildNode имеет отношение многие к одному. В случае, если мне нужно удалить один ChildNode, я сначала удаляю ParentNode, затем ChildNode ()
- Удаление только одного ChildNode будет сделано так:
Удаление одного ChildNode: нет проблем (если в списке присутствует только 1)
Удаление нескольких дочерних узлов: ошибка ссылки FK Null
{
...
foreach(ParentNode parentToDelete in parentNodeList)
{
db.Entry(parentToDelete).State = EntityState.Deleted;
db.SaveChanges();
}
foreach(ChildNode childToDelete in childNodeList)
{
db.Entry(childToDelete).State = EntityState.Deleted;
db.SaveChanges(); //Error Exception occurs here!!
}
...
}
сообщение об ошибке:
Исключение типа "System.InvalidOperationException" произошло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительная информация: Операция завершилась неудачно: Невозможно изменить отношение, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
Состояние строк таблицы при возникновении ошибки
родитель
PK: RestaurantMenuCategoryId
FK: restaurantMenuNameId
ребенок
PK: restaurantMenuNameId
Как вы можете видеть, родительская таблица по-прежнему имеет ссылку на дочернюю строку restaurantMenuNameId == 2, хотя ожидается, что родительская ссылка должна быть удалена перед доступом к дочерней таблице.
Мои наблюдения:
- Глядя на базу данных, кажется, что когда db.SaveChanges() происходит для родительского узла, даже если запрос DELETE в базе данных не выполнялся, код продолжает двигаться асинхронно. Синхронное поведение следует использовать вместо пожара и забыть?
- Другая возможность состоит в том, что DbContext не обновляется после удаления родителя, это могло бы быть правдой, если при просмотре БД родительские строки были удалены, но они были "все еще там". Так, что происходит?
Вопрос: Пожалуйста, дайте мне знать, в чем проблема, каковы основные темы, связанные с этой проблемой?