ASP.NET MVC. Как вручную добавить "каскадное удаление" к коду первого отношения?
Как настроить каскадное удаление в проекте Code First, не задав для свойств навигации значение [Обязательный] или не обнуляемое?
например:
class MainClass{
[Key] int id {get;set;}
public string name {get;set;}
public virtual ICollection<SubItem> subItems {get;set}
}
а также
Class SubItem{
[Key] int id {get; set;}
public string name {get;set;}
}
Удаление основного класса должно удалить все связанные подэлементы
1 ответ
Чтобы иметь возможность каскадного удаления внешних ключей Nullable с помощью сначала настроенного кода, наилучшим способом достижения этого, вероятно, является использование Fluent API.
Добавьте этот свободный код API в ваш DBContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<SubItem>()
.HasOptional(o => o.MainClass)
.WithMany(m => m.subItems)
.HasForeignKey(k => k.MainClassId)
.WillCascadeOnDelete(true);
}
и ваш класс SubItem должен быть обновлен с этими свойствами:
Class SubItem
{
[Key] int id {get; set;}
public string name {get;set;}
public int? MainClassId { get; set;}
public virtual MainClass MainClass { get; set; }
}
Я полагаю, что если вы удаляете элемент MainClass, то субтитры ДОЛЖНЫ быть загружены в контексте (используя оператор включения при извлечении объекта MainClass) для удаления.
но если вы зайдете в свою базу данных и настроите этот внешний ключ для включения каскада при удалении, то вам не нужно будет загружать в контекст подэлементы, потому что база данных позаботится об удалении каскада за вас, когда объект MainClass удален.