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)

Most upvoted comments

@SoftCircuits I think you meant to use the Microsoft.EntityFrameworkCore.Sqlite package instead. The Core one is for those who want to provide their own native SQLite library.

- <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="6.0.7" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.7" />

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_sqlite3 package reference to the project (I was not using the Microsoft.EntityFrameworkCore.Sqlite NuGet package, but a locally compiled build instead):

<ItemGroup>
    <PackageReference Include="SQLitePCLRaw.core" Version="2.0.4" />
    <PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.0.4" />
</ItemGroup>

@bricelam Same error with latest Microsoft.EntityFrameworkCore.Sqlite 7.0.3 on .NET 7.0 (latest Visual Studio 2022 17.5.6 Preview)

Does manually adding a call to SQLitePCL.Batteries_V2.Init() in you app work around the issue?

If I add this line before DbContext access - I get an error (despite of SQLitePCLRaw.batteries_v2.dll is present in output directory);

System.IO.FileNotFoundException: ‘Could not load file or assembly ‘SQLitePCLRaw.batteries_v2, Version=2.1.4.1835, Culture=neutral, PublicKeyToken=8226ea5df37bcae9’. Не удается найти указанный файл.’

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.Sqlite package, 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.

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.7">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="6.0.7" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.7">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

add-migration ran without errors.

update-database failed.

PM> update-database
Build started...
Build succeeded.
System.Exception: 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 SQLitePCL.raw.sqlite3_open_v2(String filename, sqlite3& db, Int32 flags, String vfs)
   at Microsoft.Data.Sqlite.SqliteConnectionInternal..ctor(SqliteConnectionStringBuilder connectionOptions, SqliteConnectionPool pool)
   at Microsoft.Data.Sqlite.SqliteConnectionFactory.GetConnection(SqliteConnection outerConnection)
   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.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

Not sure what that was about C++. This is a C# project.

Calling SQLitePCL.Batteries_V2.Init() changes nothing in my case…