efcore: "You need to call SQLitePCL.raw.SetProvider()" error when using Microsoft.EntityFrameworkCore.Sqlite 5.0.4 via C++\CLI wrapper
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
About this issue
- Original URL
- State: open
- Created 3 years ago
- Reactions: 5
- Comments: 22 (8 by maintainers)
@SoftCircuits I think you meant to use the
Microsoft.EntityFrameworkCore.Sqlitepackage instead. The Core one is for those who want to provide their own native SQLite library.I had erroneously added this package, which does not include the BCL
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="7.0.4" />Adding this version instead fixed it for me
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.4" />Came across the same exception while checking the scope of an EF Core bug (unrelated to this issue here) on other providers.
Solved it for me by adding the
SQLitePCLRaw.bundle_e_sqlite3package reference to the project (I was not using theMicrosoft.EntityFrameworkCore.SqliteNuGet package, but a locally compiled build instead):@bricelam Same error with latest Microsoft.EntityFrameworkCore.Sqlite 7.0.3 on .NET 7.0 (latest Visual Studio 2022 17.5.6 Preview)
If I add this line before DbContext access - I get an error (despite of SQLitePCLRaw.batteries_v2.dll is present in output directory);
Did you obtained some help from Microsoft C++\CLI team? This issue exists for almost 2 years 😦
For my .NET Standard 2.1 project, I was getting same error. Once I added
Microsoft.Data.Sqlitepackage, all started working fine..NET 6-preview5 was out almost a month ago. Any updates on this issue?
I’m getting this error with native AOT on .NET 7. I’m using
Microsoft.Data.Sqlite.@bricelam Sorry, that was the issue. Naming is a little confusing here. I appreciate you taking a look.
Is there nothing Microsoft can tell us about this?
I’m using .NET 6. And I’m trying to follow Microsoft documentation.
add-migrationran without errors.update-databasefailed.Not sure what that was about C++. This is a C# project.
Calling
SQLitePCL.Batteries_V2.Init()changes nothing in my case…