在处理上下文后,SQLite + EntityFramework对使连接保持活动状态

时间:2013-06-17 14:29:30

标签: c# entity-framework system.data.sqlite

我正在使用SQLite for .Net和.Net Framework 4.0的EntityFramework。在我从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)。正如您在this ticket中看到的那样,您应该正确处理所有sqlite命令和读者。但EF 4没有这样做(至少在.net框架4版本中)。例如,请参阅ObjectContent.ExecuteStoreCommand方法。它隐式地从SQLite连接创建一个命令,并不处理它。

是的,我可以使用正确的命令处理编写我自己的executeStoreCommand(ObjectContent context, string script, params object[] parameters)方法但是如何处理context.SaveChanges()

有人知道它是在EF或SQLite的下一版本中修复的吗?或者可能有任何变通方法?

1 个答案:

答案 0 :(得分:0)

出现此问题的原因是System.Data.SQLite中的更改关闭行为,它在某种程度上与EF不兼容。 详情请见此处:http://www.mail-archive.com/sqlite-users%40sqlite.org/msg74770.html

由于这只是在我的集成测试中,我使用此处的解决方法来解决这个问题: System.Data.SQLite Close() not releasing database file