Почему 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

Другие вопросы по тегам