Страницы

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

понедельник, 15 октября 2018 г.

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(); } }
Подскажите, почему не происходит каскадного удаления?


Ответ

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

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

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