EF Core с SQLite на Mono: e_sqlite3 не найден - PullRequest
0 голосов
/ 24 мая 2019

Мы используем Entity Framework Core 2.2.4 вместе с базой данных SQLite для .NET Framework 4.7.2. Установлены следующие пакеты Nuget:

Microsoft.Data.Sqlite
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools

На моей машине для разработки (Windows 10) все работает нормально, но при попытке запустить приложение с Mono на нашем 32-битном компьютере с Linux возникает следующее исключение:

FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type 
initializer for 'Microsoft.Data.Sqlite.SqliteConnection' threw an exception. 
---> System.Reflection.TargetInvocationException: Exception has been thrown 
by the target of an invocation. ---> System.DllNotFoundException: e_sqlite3
at (wrapper managed-to-native) 
SQLitePCL.SQLite3Provider_e_sqlite3+NativeMethods.sqlite3_libversion_number()
  at SQLitePCL.SQLite3Provider_e_sqlite3.SQLitePCL.ISQLite3Provider.sqlite3_libversion_number () [0x00000] in <61bb3ca1db9c41ea88f280f0b1600d58>:0
  at SQLitePCL.raw.SetProvider (SQLitePCL.ISQLite3Provider imp) [0x00008] in <3d4b21fb9c764efbb11f6e3b02efff52>:0
  at SQLitePCL.Batteries_V2.Init () [0x00005] in <f5d9c86a14864b5d99b8bdece1b8292c>:0
  at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00032] in <a89b9d7c1a66468eb33312af7ed3a74e>:0
   --- End of inner exception stack trace ---
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00048] in <a89b9d7c1a66468eb33312af7ed3a74e>:0
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <a89b9d7c1a66468eb33312af7ed3a74e>:0
  at Microsoft.Data.Sqlite.Utilities.BundleInitializer.Initialize () [0x0002f] in <b46e232ade014524baa458345f270c50>:0
  at Microsoft.Data.Sqlite.SqliteConnection..cctor () [0x00000] in <b46e232ade014524baa458345f270c50>:0
   --- End of inner exception stack trace ---
  at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_generic_class_init(intptr)
  at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteRelationalConnection.CreateDbConnection () [0x00006] in <74192050a4d342039620dc7ef6678f71>:0
  at Microsoft.EntityFrameworkCore.Internal.LazyRef`1[T].get_Value () [0x00008] in <adf771f92e754fe1bb85c5850cd0c16b>:0
  at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.get_DbConnection () [0x00000] in <69f795dffc844780bfcfff4ff8415a92>:0
  at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open (System.Boolean errorsExpected) [0x00000] in <69f795dffc844780bfcfff4ff8415a92>:0
  at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteRelationalConnection.Open (System.Boolean errorsExpected) [0x00000] in <74192050a4d342039620dc7ef6678f71>:0
  at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists () [0x0000c] in <74192050a4d342039620dc7ef6678f71>:0
  at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists () [0x0000b] in <69f795dffc844780bfcfff4ff8415a92>:0
  at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate (System.String targetMigration) [0x00012] in <69f795dffc844780bfcfff4ff8415a92>:0
  at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate (Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade databaseFacade) [0x00010] in <69f795dffc844780bfcfff4ff8415a92>:0
  at TestEfCorePlusSqlite.Program.Main (System.String[] args) [0x0000e] in <c4fad569c9a241ef887b5b2ddbc0225f>:0

Поскольку приложение построено с любой конфигурацией ЦП, в bin / Debug создаются папки x86 и x64, обе из которых содержат e_sqlite3.dll. Я уже пытался скопировать dll x86 в bin / Debug, но ошибка все еще произошла.

Что я пробовал до сих пор:

  • установка Microsoft.EntityFrameworkCore.Sqlite.Core вместе с SQLitePCLRaw.bundle_e_sqlite3 как предложено здесь
  • установка Microsoft.EntityFrameworkCore.Sqlite (или Microsoft.Data.Sqlite или SQLitePCLRaw.bundle_green) как предложено здесь
  • различных комбинаций SQLitePCLRaw.* пакетов

Что мне нужно сделать, чтобы EF Core и SQlite работали на Mono?

1 Ответ

0 голосов
/ 27 мая 2019

После освежающих выходных я еще раз взглянул на проблему.Я нашел официальную документацию Mono относительно DllNotFoundException и использовал MONO_LOG_LEVEL=debug mono YourApp.exe, чтобы узнать, какую lib Mono пытается загрузить.Это был /usr/lib/libe_sqlite3.so, который не был доступен в моей системе.Все, что я сделал, это скопировал доступную /usr/lib/libsqlite3.so и переименовал ее в libe_sqlite3.so.Я не уверен, что это предпочтительный способ, но мое приложение работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...