"You need to call SQLitePCL.raw.SetProvider()" error when using Microsoft.EntityFrameworkCore.Sqlite 5.0.4 via C++\CLI wrapper
#24,493 建立於 2021年3月24日
描述
I have a solution with the following structure:
- DomainObjects - .NET 5.0 class library without any special dependencies, contains entities. Compiled as x86.
- DAL (references DomainObjects) - .NET 5.0 class library which references Microsoft.EntityFrameworkCore.Sqlite 5.0.4 nuget package, contains DbContext and migrations (database is created at d:\test.db). Compiled as x86.
- DAL.Test (references DAL) - .NET 5.0 console test application. Compiled as x86.
- DAL.Interop (references DAL) - .NET 5.0 C++\CLI wrapper. Compiled as x86, Multi-byte Character Set, wchar_t-.
- DAL.Interop.Test - C++ console test application. Compiled as x86, Multi-byte Character Set, wchar_t-.
DAL.Test runs without any problems, but DAL.Interop.Test throws an exception (inside DAL class library):
You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init().
NB! If I switch from Microsoft.EntityFrameworkCore.Sqlite provider to Devart.Data.SQlite.EFCore provider - both test applications (.NET and C++) run without any problems.
NB2! If I remember correctly code was working with no problems with Microsoft.EntityFrameworkCore.Sqlite 3.1 on .NET Core 3.1.
Sample repo - https://github.com/bairog/EFCore5SQLiteCLRTest Compile it (for some reason you need to compile twice for compiling DAL.Interop.Test project) and start debugging DAL project (it starts DAL.Interop.Test.exe in project Debug settings)
Stack traces
Source: SQLitePCLRaw.core
You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init().
at SQLitePCL.raw.get_Provider()
at SQLitePCL.raw.sqlite3_open_v2(utf8z filename, sqlite3& db, Int32 flags, utf8z vfs)
at Microsoft.Data.Sqlite.SqliteConnection.Open()
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists()
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations()
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetAppliedMigrations(DatabaseFacade databaseFacade)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetPendingMigrations(DatabaseFacade databaseFacade)
at DAL.CRUD.CreateDbContext() in D:\EFCore5SQLiteCLRTest\DAL\CRUD.cs:line 14
Provider and version information
EF Core version: 5.0.4 Database provider: Microsoft.EntityFrameworkCore.Sqlite Target framework: .NET 5.0 Operating system: Windows 10 x64 1909 IDE: Visual Studio 2019 16.9.2 REL Community