How*_*May 4 c# sqlite entity-framework
我有一个简单的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);
Run Code Online (Sandbox Code Playgroud)
以下是我从EF中删除条目的方法
var dataSets = from ds in context.DataSets select ds;
foreach (var ds in dataSets)
context.DataSets.DeleteObject(ds);
context.SaveChanges();
return true;
Run Code Online (Sandbox Code Playgroud)
eri*_*ikH 10
通过在连接字符串中启用外键可以解决此问题:
data source=mydb.db;foreign keys=true
Run Code Online (Sandbox Code Playgroud)
小智 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;");
}
Run Code Online (Sandbox Code Playgroud)
从SQLite文档:http://www.sqlite.org/foreignkeys.html
默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用.
这可能是你的问题吗?我不知道您的实体框架是否默认启用它:
sqlite> PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)
编辑:看得更远,我偶然发现了这个:http://nitoprograms.blogspot.com/2010_06_01_archive.html
实体框架实际上是一个ADO.NET数据提供程序,它本身包装了一个ADO.NET数据提供程序(SQLite,具体而言).通常,实体框架会在需要时打开数据库连接; 当Entity Framework完成后,这些自动打开的连接会自动关闭.由于其ADO.NET提供程序的连接池,此默认行为适用于SQL Server.但是,由于SQLite连接本身存在各种"属性",因此它无法与SQLite一起使用.一个例子是"PRAGMA foreign_keys = ON",它仅对该SQLite数据库连接强制执行外键.如果实体框架随意打开和关闭其连接,那么这些SQLite PRAGMA就会丢失.
| 归档时间: |
|
| 查看次数: |
2346 次 |
| 最近记录: |