我无法使用 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] 删除。
我来说两句