Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Entity Framework. Не работает каскадное удаление

#c_sharp #entity_framework


Entity Framework 6, Code First, SQLite

Есть дерево категорий. Если удалить категорию, которая включает в себя подкатегории,
подкатегории не удаляются каскадно. Они по прежнему имеют ParentId, указывающий на
уже не существующую категорию.

Модель ссылающаяся на себя:

public class Category
{
    public string Title { get; set; }
    public int SortOrder { get; set; }

    public int? ParentId { get; set; }
    public Category Parent { get; set; }

    public ICollection Children { get; set; }
    public ICollection Products { get; set; }
}


Конфигурация:

public class CategoryConfiguration : EntityTypeConfiguration
{
    public CategoryConfiguration()
    {
        Property(p => p.Title).IsRequired();

        HasOptional(p => p.Parent)
            .WithMany(p => p.Children)
            .HasForeignKey(p => p.ParentId)
            .WillCascadeOnDelete(true);
    }
}


Таблица:

CREATE TABLE Categories
(
    Id INTEGER PRIMARY KEY,
    Title nvarchar NOT NULL,
    SortOrder int NOT NULL,
    ParentId int,
    FOREIGN KEY (ParentId) REFERENCES Categories (Id) ON DELETE CASCADE
);
CREATE INDEX IX_Category_ParentId ON Categories (ParentId)


Метод удаления категории:

public void Delete(Category category)
{
    using (var db = new DbContext())
    {
        var entity = db.Categories.Find(category.Id);
        if (entity != null)
        {
            db.Categories.Remove(entity);
        }
        db.SaveChanges();
    }
}


Подскажите, почему не происходит каскадного удаления?
    


Ответы

Ответ 1



Проблема оказалась в следующем: в SQLite по умолчанию отключена поддержка ограничения внешних ключей. Для ее включения необходимо установить PRAGMA foreign_keys = ON. Это можно сделать, изменив строку подключения ConnectionString в конфиге: data source=C:\Dbs\myDb.db;foreign keys=true;

Комментариев нет:

Отправить комментарий