【问题标题】:Cascade on delete not cascading with EF删除时级联不与 EF 级联
【发布时间】:2013-12-09 19:58:04
【问题描述】:

我有一个带有两个表的简单 sqlite 数据库。当我手动删除(使用 SQLite Expert)表 DataSets 中的条目时,OneD 中的对应条目将按预期删除。当我从实体框架中删除 DataSets 中的条目时,它不会导致 One D 中的对应条目被删除。没有产生错误。

知道为什么吗?

问候

这是数据库定义:

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;

【问题讨论】:

    标签: c# entity-framework sqlite


    【解决方案1】:

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

    data source=mydb.db;foreign keys=true
    

    【讨论】:

    • 当我将外键=true 添加到连接字符串时,我收到此错误:{"The underlying provider failed on Open."}
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      来自 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 已丢失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多