Как вы убедитесь, что Каскадное удаление сначала включено в отношении таблиц в EF Code? - PullRequest
27 голосов
/ 29 марта 2011

Я хотел бы включить CASCADE DELETE для таблицы с использованием кода в первую очередь.Когда модель воссоздается с нуля, CASCADE DELETE не устанавливается, хотя отношения устанавливаются автоматически.Странно то, что он ДЕЙСТВИТЕЛЬНО разрешает это для некоторых таблиц, имеющих отношение «многие ко многим», с которыми, как вы думаете, могут возникнуть проблемы.

Настройка: Таблица A <- Таблица B. </p>

FK таблицы B указывает на PK таблицы A.

Почему бы это не сработало?

Ответы [ 2 ]

54 голосов
/ 29 марта 2011

Возможная причина, по которой вы не получаете каскадное удаление, заключается в том, что ваши отношения не являются обязательными.Пример:

public class Category
{
    public int CategoryId { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public Category Category { get; set; }
}

В этой модели вы получите таблицу Product, которая имеет внешний ключ к таблице Category, но этот ключ может иметь значение null, и по умолчанию в базе данных отсутствует установка каскадного удаления.

Если вы хотите, чтобы связь была обязательной, у вас есть две опции:

Аннотации:

public class Product
{
    public int ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}

Свободный API:

modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany();

В обоих случаях каскадированиеудаление будет настроено автоматически.

Если вы хотите, чтобы отношение было необязательным, но с каскадным удалением , вам необходимо настроить это явно:

modelBuilder.Entity<Product>()
            .HasOptional(p => p.Category)
            .WithMany()
            .WillCascadeOnDelete(true);

Редактировать: ВПоследний фрагмент кода вы также можете просто написать .WillCascadeOnDelete().Эта перегрузка без параметров по умолчанию равна true для настройки каскадного удаления.

Подробнее об этом см. В документации

0 голосов
/ 05 февраля 2015
modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);
...