级联删除不与EF级联

时间:2011-10-06 12:35:53

标签: c# entity-framework sqlite

我有一个带有两个表的简单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;

3 个答案:

答案 0 :(得分:10)

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

data source=mydb.db;foreign keys=true

答案 1 :(得分:7)

这是我解决这个问题的方法:

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;");            
}

答案 2 :(得分:6)

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

  

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

这可能是你的问题吗?我不知道您的实体框架是否默认启用它:

  sqlite> PRAGMA foreign_keys = ON;

修改:进一步了解我偶然发现了这一点:http://nitoprograms.blogspot.com/2010_06_01_archive.html

  

实体框架实际上是一个ADO.NET数据提供者   本身包装一个ADO.NET数据提供程序(SQLite,具体而言)。   通常,实体框架将打开数据库连接   只要它需要一个;这些自动打开的连接是   实体框架完成后自动关闭。   由于其ADO.NET,此默认行为适用于SQL Server   提供者的连接池。但是,它并不适用   SQLite,由于SQLite连接上存在各种“属性”   本身。一个例子是“PRAGMA foreign_keys = ON”,它强制执行   仅用于该SQLite数据库连接的外键。如果是实体   框架随意打开和关闭其连接,然后是SQLite   像这样的PRAGMA就丢失了。