.Net Framework 4.0 の .Net および 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 に移行したためです (これを参照)。このチケットでわかるように、すべての sqlite コマンドとリーダーを適切に破棄する必要があります。しかし、EF 4 はそれを行いません (少なくとも .net Framework 4 バージョンでは)。たとえば、ObjectContent.ExecuteStoreCommand
メソッドを参照してください。SQLite 接続から暗黙的にコマンドを作成し、破棄しません。
はい、executeStoreCommand(ObjectContent context, string script, params object[] parameters)
適切なコマンドの破棄を使用して独自のメソッドを作成できますが、どうすればよいcontext.SaveChanges()
ですか?
EFまたはSQLiteの次のリリースで修正されたかどうかは誰にもわかりませんか? または、回避策があるかもしれませんか?