以下に示すように、SQLiteインメモリdbcontextを初期化するテストフィクスチャがあります。
public static MYAPPDBContext Create()
{
var options = new DbContextOptionsBuilder<MYAPPDBContext>()
.UseSqlite("DataSource=:memory:")
.Options;
var context = new MYAPPDBContext(options);
context.Database.OpenConnection(); // this is where exception is thrown
context.Database.EnsureCreated();
return context;
}
Create()メソッドを呼び出すと、次のNullReferenceExceptionが発生します。
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=Microsoft.Data.Sqlite
StackTrace:
at Microsoft.Data.Sqlite.SqliteConnection.Open()
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteRelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.<>c.<OpenConnection>b__15_0(DatabaseFacade database)
at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, Func`2 verifySucceeded, TState state)
at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.OpenConnection(DatabaseFacade databaseFacade)
at MYAPPPlus.UnitTests.TestInfrastructure.MYAPPContextFactory.Create() in C:\websites\MYAPPPremier\tests\MYAPPPlus.UnitTests\TestInfrastructure\MYAPPContextFactory.cs:line 26
at MYAPPPlus.UnitTests.TestInfrastructure.QueryTestFixture..ctor() in C:\websites\MYAPPPremier\tests\MYAPPPlus.UnitTests\TestInfrastructure\QueryTestFixture.cs:line 24
何が起こっているのかについてのアイデアはありますか?
参考までに、私は https://garywoodfine.com/entity-framework-core-memory-testing-database/ のブログ投稿を基にコードを作成しています。また、基本的なefコアのインメモリデータベースを使用すると、私のフィクスチャは問題なく動作します。
Microsoft.Data.Sqlite.SqliteConnection
を開こうとしたときにも同様の問題があり、System.NullReferenceException
もスローしていました。接続を初期化していたクラスは、ライブラリプロジェクト参照にありました:
Microsoft.Data.Sqlite
-v3.1.2Microsoft.Data.Sqlite.Core
-v3.1.2この場合の実行可能ファイルは、テストプロジェクトにあるNUnit
testでした。テストプロジェクトはSqlite
NuGetパッケージを参照していませんでしたが、データベースロジックを含むライブラリへのプロジェクト参照がありました。テストプロジェクトのビルド中に、一部のSqlite
dllがbin
ディレクトリにコピーされましたが、すべてではありませんでしたが、結局問題であることが判明しました。テストプロジェクトで両方のSqlite
NuGetパッケージへの参照を追加すると、問題が解決しました。
記事にタイプミスがあったようです。
DataSource
エイリアスはここでは機能しません。"Data Source=:memory:"
を使用する必要があります(スペース付き)
var options = new DbContextOptionsBuilder<MYAPPDBContext>()
.UseSqlite("Data Source=:memory:") //<-- Note the space
.Options;
リファレンス DbContextの構成