Ответ 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
для настройки каскадного удаления.
Подробнее об этом в документации