如何在 SQLite 和实体框架 6 中使用 ON DELETE CASCADE

我无法使用 SQLite 和 Entity Framework 6 (EF6) 进行DELETE CASCADE工作。有什么我想念的吗?

我使用 Visual Studio 2015 在 C# 中创建了一个 Windows 窗体应用程序。EF6 和 SQLite 在我的应用程序中很好地协同工作,我可以插入和检索数据。但是在删除内容时,删除一行/实体可以正常工作,但级联根本不起作用。使用DB Browser for SQLite,我删除了完全相同的行,并且级联工作。

这是我的代表节点的表:

CREATE TABLE `Nodes` (
    `NodeId`    INTEGER,
    `ParentId`  INTEGER,
    `Label` TEXT,
    PRIMARY KEY(`NodeId`),
    FOREIGN KEY(`ParentId`) REFERENCES `Nodes`(`NodeId`) ON DELETE CASCADE
);

这就是我删除“根”节点的方式(应该用级联删除每个子节点):

var noParentItems = entities.Nodes.Where(n => n.ParentId == null);
foreach (var root in noParentItems)
{
     //entities.Entry(root).State = EntityState.Deleted;
     entities.Nodes.Remove(root);
}
entities.SaveChanges();

注意:我还尝试了注释版本来删除“root”。在这里您可以看到我正在循环以捕获每个根节点,但这并不重要。

我正在为 EF6 使用数据库优先方法。请注意,我不想修改任何生成的文件来解决这个问题。

此外,这些解决方案对我不起作用:

请随时询问您可能需要的任何其他信息。

谢谢。

感谢评论,我找到了解决这个问题的方法。

首先我看了这个答案:Cascade on delete not cascading with EF

重要的部分是这句话:

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

所以,如果有放置指令的地方,它只会在连接字符串中。

因此我补充说:

foreign keys=True

现在它工作正常!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Angular 6中使用mouseover和mouseout

EF 6和SQLite 1.0.96.0的“未找到实体框架提供程序”

如何在实体框架和Mysql中使用规范函数

如何在Visual Studio 2013中为sqlite配置实体框架6

在实体框架6中使用TransactionScope

实体框架核心,DELETE CASCADE和[Required]

如何在实体框架和EF Core中使用.include()

如何在实体框架中使用SQL Server更改跟踪

如何在Angular 6中使用http delete()

在DELETE CASCADE上无法在雪花中使用

如何在sqlite中使用%和like值?

如何在实体框架中使用“ In” SQL关键字?

如何在Vagrant和VirtualBox中使用ipv6?

如何在ASP.NET MVC 5,实体框架6中使用流畅的API映射表?

如何在Xcode 6和Storyboard中使用NSToolBar?

如何在vNext MVC中使用实体框架和OData

如何使用LINQ和实体框架6进行表联接?

如何解决:使用derby / EmbeddedDriver在更新CASCADE上删除DELETE CASCADE

如何在实体框架中使用分组依据和具有计数子句

使用实体框架时如何在联接中使用OR

如何在数据库优先和身份列中使用实体框架

如何使用实体框架在SQLite中设置线程模式?

如何在实体框架中使用 lambda 表达式和谓词

SQLite:ON DELETE CASCADE 无法正常工作

Cascade=delete 不删除相关实体

如何在 rxjs6 中使用 combineLatest 和 flatMap?

如何使用 CASCADE DELETE 删除所有租户数据

如何在实体框架 6 中使用 DbDataReader 获取表名?

如何使用与 MySQL 的递归关系进行 CASCADE ON DELETE