"You need to call SQLitePCL.raw.SetProvider()" error when using Microsoft.EntityFrameworkCore.Sqlite 5.0.4 via C++\CLI wrapper

Open
#24,493 29 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
cpp, csharp, sqlite
Domain
backend, databases

Research direction

Start by reproducing the difference between DAL.Test and DAL.Interop.Test from the linked EFCore5SQLiteCLRTest repository. Inspect DAL/CRUD.cs at line 14, then compare the project references and runtime setup for the managed and C++/CLI test applications. Done means DAL.Interop.Test can create the database without the SQLitePCL provider exception while DAL.Test continues to pass.

Written by the indexing model from the issue text.

Description

area-adonet-sqlite customer-reported help wanted

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

Dominant language
C#
Stars
14.8k
Forks
3.4k
Avg merge
2d 5h
Merged PRs (30d)
134

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/efcore

All issues in dotnet/efcore

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.