Подтвердить что ты не робот

Как вы гарантируете, что Cascade Delete включена в отношении отношения таблицы в EF Code?

Я хотел бы включить CASCADE DELETE в таблице с использованием кода. Когда модель воссоздается с нуля, набор CASCADE DELETE не установлен, даже если отношения настроены автоматически. Странно то, что он разрешает это для некоторых таблиц с отношением "многие-многие", хотя, по-вашему, у него могут быть проблемы с.

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

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

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

4b9b3361

Ответ 1

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

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; }
}

Fluent API:

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

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

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

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

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

Подробнее об этом в документации

Ответ 2

modelBuilder
.Entity<Product>()
.HasRequired(p => p.Category)
.WithMany(x => x.Products)
.WillCascadeOnDelete(true);