级联删除不与EF级联

我有一个简单的sqlite数据库,有两个表。 当我手动删除(使用SQLite Expert)表DataSets中的条目时,OneD中的相应条目将按预期删除。 当我从Entity Framework中删除DataSet中的条目时,它不会导致删除One D中的coreponsing条目。 没有生成错误。

知道为什么吗?

问候

这是数据库定义:

CREATE TABLE [DataSets] ( [DataSetId] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY AUTOINCREMENT, [Description] TEXT(128)); CREATE TABLE [OneD] ( [OneDId] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY ON CONFLICT ABORT AUTOINCREMENT, [DataSetId] INTEGER NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT ABORT REFERENCES [DataSets]([DataSetId]) ON DELETE CASCADE, [StockSheetLength] INTEGER NOT NULL ON CONFLICT FAIL); 

以下是我从EF中删除条目的方法

  var dataSets = from ds in context.DataSets select ds; foreach (var ds in dataSets) context.DataSets.DeleteObject(ds); context.SaveChanges(); return true; 

从SQLite文档: http : //www.sqlite.org/foreignkeys.html

默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用。

这可能是你的问题吗? 我不知道您的entity framework是否默认启用它:

  sqlite> PRAGMA foreign_keys = ON; 

编辑:看得更远,我偶然发现了这个: http : //nitoprograms.blogspot.com/2010_06_01_archive.html

entity framework实际上是一个ADO.NET数据提供程序,它本身包装了一个ADO.NET数据提供程序(SQLite,具体而言)。 通常,entity framework会在需要时打开数据库连接; 当Entity Framework完成后,这些自动打开的连接将自动关闭。 由于其ADO.NET提供程序的连接池,此默认行为适用于SQL Server。 但是,由于SQLite连接本身存在各种“属性”,因此它无法与SQLite一起使用。 一个例子是“PRAGMA foreign_keys = ON”,它仅对该SQLite数据库连接强制执行外键。 如果entity framework随意打开和关闭其连接,那么这些SQLite PRAGMA就会丢失。

通过在连接字符串中启用外键可以解决此问题:

 data source=mydb.db;foreign keys=true 

这是我对这个问题的解决方案:

 db.Connection.StateChange += ConnectionStateChange; void ConnectionStateChange(object sender, System.Data.StateChangeEventArgs e) { if (e.CurrentState == System.Data.ConnectionState.Open) db.ExecuteStoreCommand("PRAGMA foreign_keys = true;"); }