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

302
26 июня 2017, 17:29

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<Category> Children { get; set; }
    public ICollection<Product> Products { get; set; }
}

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

public class CategoryConfiguration : EntityTypeConfiguration<Category>
{
    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();
    }
}

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

Answer 1

Проблема оказалась в следующем: в SQLite по умолчанию отключена поддержка ограничения внешних ключей.

Для ее включения необходимо установить PRAGMA foreign_keys = ON.

Это можно сделать, изменив строку подключения ConnectionString в конфиге:

data source=C:\Dbs\myDb.db;foreign keys=true;
READ ALSO
Подрезка строки с конца на указанное количество символов в C#

Подрезка строки с конца на указанное количество символов в C#

Существует ли какая-либо функция для этой задачи, или же придется делать вручную? Код работает не правильно!

326
C# создать список объектов из дессериализации дерева объектов JSON

C# создать список объектов из дессериализации дерева объектов JSON

Сразу хочу сказать, что я начинающий разработчик и прошу прощения, если вопрос поставлен не корректноНигде не нашел, как обратится к вложенному...

362
Отслеживание изменений в SQLite WPF

Отслеживание изменений в SQLite WPF

Допустим имеется две базы данных в SQLiteКаким образом изменения в одной, со временем, можно применить в другой?

313
Ограничить время жизни потока

Ограничить время жизни потока

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

329