实体框架 6、代码优先、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();
}
}
告诉我为什么没有级联删除?
问题原来是这样的:SQLite默认不支持外键约束。
要启用它,您需要安装
PRAGMA foreign_keys = ON.这可以通过更改
ConnectionString配置中的连接字符串来完成: