3

我正在为 .Net 和 .Net Framework 4.0 的 EntityFramework 使用 SQLite。一切都很好,直到我从 SQLite v.1.0.79.0 迁移到 v.1.0.86.0。从那时起这样的代码

using (var context = new EntityContent(sqliteConnectionString))
{
    context.ExecuteStoreCommand(mySqlScriptString);
    /*
     * or do some stuff with context entities and call context.SaveChanges()
     */
}
deleteSQLiteDbFile(getDbFilePath(sqliteConnectionString)); // <-- here is the error

抛出错误 System.IO.IOException:“该进程无法访问文件 'mydatabase.dat',因为它正被另一个进程使用。”

这完全是因为迁移到 SQLite v.1.0.82.0 中的新 sqlite3_close_v2() API(请参阅this)。正如您在这张票中看到的,您应该正确处理所有 sqlite 命令和阅读器。但是 EF 4 并没有这样做(至少在 .net framework 4 版本中)。例如,参见ObjectContent.ExecuteStoreCommand方法。它隐式地从 SQLite 连接创建一个命令并且不释放它。

是的,我可以编写自己的executeStoreCommand(ObjectContent context, string script, params object[] parameters)方法并使用适当的命令处理,但是该怎么办context.SaveChanges()

有人知道它是否在 EF 或 SQLite 的下一个版本中修复了吗?或者可能有任何解决方法?

4

1 回答 1

0

这个问题的原因是 System.Data.SQLite 中的关闭行为发生了变化,它在某种程度上不再与 EF 兼容。详情见这里: http: //www.mail-archive.com/sqlite-users%40sqlite.org/msg74770.html

因为这只是在我的集成测试中,所以我使用了这里的解决方法来解决这个问题: System.Data.SQLite Close() not publishing database file

于 2014-06-06T11:54:27.940 回答