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 удален.

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