最近作为娱乐,我决定开发一个小项目来测试 SQlite 与库System.Data.SQLite提供的 EntityFramework 的好处。
该应用程序有一个数据同步过程,随着时间的推移变得过时,所以我决定从数据库中删除它们。正如预期的那样,删除表行并不会减少数据库的大小,所以我决定在其中运行命令 VACUUM。
在阅读了这篇优秀的博客SQLite、VACUUM 和 auto_vacuum 之后,我对一切都变得更加清晰,尤其是命令不能在事务中执行的事实。
就像 Code First 还不可用一样,我必须使用脚本在数据库中创建表,所以我在同一个地方执行命令。
using (var context = new Context())
{
context.Database.CreateIfNotExists();
context.Database.ExecuteSqlCommand(
"CREATE TABLE IF NOT EXISTS \"main\".\"OutgoingMessages\" (\"Id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\"AccountId\" TEXT NOT NULL ON CONFLICT ROLLBACK,\"MessageId\" TEXT NOT NULL ON CONFLICT ROLLBACK,\"Date\" datetime NOT NULL ON CONFLICT ROLLBACK,\"Status\" INTEGER NOT NULL ON CONFLICT ROLLBACK,\"Content\" BLOB NOT NULL ON CONFLICT ROLLBACK,\"Size\" INTEGER NOT NULL ON CONFLICT ROLLBACK,\"Hash\" TEXT NOT NULL ON CONFLICT ROLLBACK,\"Comment\" TEXT);" +
"CREATE TABLE IF NOT EXISTS \"main\".\"IncomingMessages\" (\"Id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\"AccountId\" TEXT NOT NULL ON CONFLICT ROLLBACK,\"MessageId\" TEXT NOT NULL ON CONFLICT ROLLBACK,\"Date\" datetime NOT NULL,\"Status\" INTEGER NOT NULL,\"Comment\" TEXT);");
context.Database.ExecuteSqlCommand("VACUUM;");
}
我很惊讶收到以下异常:
附加信息:SQL 逻辑错误或缺少数据库。不能从事务中 VACUUM。
An exception of type 'System.Data.SQLite.SQLiteException' occurred in EntityFramework.dll but was not handled in user code
at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt)
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
它让我认为 ExecuteSqlCommand 方法执行的所有命令都是在事务中处理的。我将EntityFramework 6.1.3 和System.Data.Sqlite 1.0.97.0 与 .NET Framework 4.5 一起使用。
问题
我错了吗?如果是这样,有没有办法执行命令?