質問: Entity Framework CoreをSqliteで使用し、拡張子が`.db`または`.sqlite`場合、エラーが発生する > SqliteException:SQLiteエラー14: 'データベースファイルを開くことができません' > > ファイル拡張子を削除すると、正常に動作します。 私はEntity Framework Coreに詳しくはなく、過去にnpocoのようなものを使ってきました。私はDataStorageとDataAggregatorに取り組んでおり、いくつかのハッカーの実装が必要な問題が発生しています。私はそれが好きではなく、それは私が汚い気分になります。 接続文字列から`.db`を削除してもうまくいきますが、ファイル拡張子を残しておくと( `.db`と`.sqlite`試しただけ`.sqlite` )、そのエラーが発生します。 再作成する手順: 1. クローン 2. `dotnet run`このソリューションを`dotnet run`する(またはユニットテストで遊ぶ)ブラウザでAggregateResults ControllerActionに移動します。 `.db`で終わるすべてのファイルと`_db_metadata.json`で終わるすべてのファイルを検索しようとしますが、見つからず、ブラウザページに "0"を返します。 3. 次に、 `DataStorageService\DataStorageService\TransmittedFiles`リポジトリに移動し、それをクリアします。 `Endpoints\DataStorage\AggregateData\AggregateDataContext.cs`移動し`Endpoints\DataStorage\AggregateData\AggregateDataContext.cs` 。行をコメントアウトする ``` if (OperatingSystemHelpers.IsOSWindows)... ``` 〜まで ``` .Remove(connectionStringFileLocation.Length - 3); ``` 前に行ったことを正確に実行しようとすると、1)AggregateData.dbファイルがTransmittedFilesに作成され、2)SqliteError 14が表示されるはずです。 TransmittedFilesフォルダをもう一度オフにしてOperatingSystemHelpers Clauseで再度試してみると、動作していることがわかります。それは存在しないファイルの問題ではありません。
回答: この問題は、以前の接続がファイルにまだアクセスしていることに起因します。 以下のスレッドで述べたように、SqliteのC#の実装では、.Close()の後で接続がガベージコレクトが実行されるまで真にクリーンアップされないクワークがあります System.Data.SQLiteデータベースファイルを解放しないClose() これを修正するには、あなたのIAggregateDataRepositoryにIDisposableを追加し、次のようなdisposeメソッドのようなものを実装することができます: ``` public void Dispose() { _database.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); } ``` あなたはあなたのテストでディスポーザーに電話をする必要があります。これはあなたのTearDownメソッドの上に以下を追加することで可能です: ``` if (_aggregateDataRepository != null) { _aggregateDataRepository.Dispose(); } ``` あなたがアプリコンテキストコンストラクタの最後にこの行を追加すると、余分なアドバイスとして、複数の接続がより嬉しい "Write Ahead Log"モードに常に確実になります。これは問題を解決するためには必要ありませんが、sqlite上で安らかなWeb APIインターフェースを作成するように見えるので、同時呼び出しを支援します。 ``` Database.ExecuteSqlCommand("PRAGMA journal_mode=WAL;"); ``` 詳細は