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
Конфигурация:
public class CategoryConfiguration : EntityTypeConfiguration
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;
Комментариев нет:
Отправить комментарий