Почему EF cascade delete не работает для отношений 0 к 1?
У меня есть следующая таблица, определенная через code-first:
public class Action
{
public int ActionId { get; set; }
public int? EmailMessageId { get; set; }
public virtual EmailMessage EmailMessage { get; set; }
}
public class EmailMessage
{
public int EmailMessageId { get; set; }
public string Content { get;set;
}
Когда действие создается с соответствующим EmailMessage, удаление действия не удаляет запись в EmailMessage. Кажется, что EF создает каскадное удаление только для отношений 1-много. В этом случае это отношение 0 или 1, для которого не установлено каскадное удаление по умолчанию.
Затем я добавил беглую конфигурацию:
modelBuilder
.Entity<Action>()
.HasOptional(x =>x.EmailMessage)
.WithMany()
.HasForeignKey(x=>x.EmailMessageId)
.WillCascadeOnDelete(true);
Который, кажется, правильно устанавливает CASCADE DELETE при просмотре схемы в Management Studio. Но когда я удаляю строку из Action вручную из базы данных, строка в EmailMessage остается.
Что именно я здесь делаю не так? Я подумал, что могу получить что-то, когда я использовал "WithOptionalDependent()" в конфигурации. Однако когда я посмотрел на схему, она ввела "EmailMessage_EmailMessageId", когда у меня уже был EmailMessageId в таблице?
Кто-нибудь может посоветовать, что здесь не так?
2 ответа
Каскадное удаление предназначено для удаления дочернего элемента при удалении родительского элемента, а не наоборот. В этом случае Action является дочерним элементом, связанным с внешним ключом родителя EmailMessage. Таким образом, удаление Action не повлияет на EmailMessage, но удаление EmailMessage должно каскадно удалить Action.
Я только что понял, при использовании "contextName.Entry(parentStudySession).State = System.Data.Entity.EntityState.Deleted;" удалить родителя с несколькими детьми. Я говорю для EF 6.3, EF не удаляет детей для нас, даже не удаляет самого родителя, даже если у нас есть каскадное ограничение на удаление. Вместо этого он выдает ошибку "Операция завершилась неудачно: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не могут быть равны нулю. Когда в отношение вносится изменение, связанное свойство внешнего ключа устанавливается на нулевое значение. Если внешний ключ не... "
Вместо этого, когда я использую "contextName.StudySession.Remove(parentStudySession);", EF 6.3 успешно удаляет РОДИТЕЛЯ и ДЕТЕЙ... У меня есть каскад на ограничение удаления. T.Adakoğlu