不能在 ASP.NET MVC 中 运行 SQLite.net PCL

Cannot run SQLite.net PCL in ASP.NET MVC

我对 Frank A. Krueger 的 SQLite.net PCL 很感兴趣。我试图将它用作 Android 应用程序和 ASP.NET MVC 网络应用程序的公共数据层。我在使用 Android 方面取得了一些成功,但在尝试将其用于 Web 应用程序时出现以下异常:

You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling SQLitePCL.Batteries.Init().

所以,我在我的控制器的构造函数中调用这个 Init 函数,同时进行数据库初始化:

SQLitePCL.Batteries.Init();

var dbPath = Path.Combine(Constants.DataDir, "SdgData.sqlite3");
var sqliteConnection = new SQLiteConnection(dbPath);
var sdgSqlRepository = new SdgSqlRepository(sqliteConnection);
crm = new CrmManager(sdgSqlRepository);

但是,似乎甚至没有调用 Init - 我在它上面设置了一个断点以及调用 Combine 的下一行,第二个是甚至没有注意到第一个就被击中了。 (可能是因为 Init 是一个 PCL 库调用不适用于 ASP.NET 平台?)

有没有办法在 ASP.NET 网络应用程序中 运行 SQLite.net PCL,或者我是否必须寻找不同的数据源?

您是否尝试过将其中一个 SQLitePCLRaw 包添加到您的项目中?

我发现在构建引用了本身引用了 SQLite-net 的可移植项目的 UWP 项目时,这是必需的。 解决方案中的两个项目都需要 SQLitePCLRaw 包才能执行对 Batteries.Init() 的调用。

异常消息中有此设置的线索。

我有同样的问题,我通过导入修复了它

SQLitePCLRaw.bundle_e_sqlite3
SQLitePCLRaw.bundle_sqlcipher
SQLitePCLRaw.bundle_green

参考

https://github.com/ericsink/SQLitePCL.raw/wiki/SQLitePCL.Batteries.Init

我找到的当前解决方案是我必须像下面这样调用它...

虽然我对这个解决方案不满意并且我想深入挖掘但现在继续使用这个解决方案 -

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string dbPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);


            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlite($@"Data Source={dbPath}\sqlite\.sample.sqlite");
                Batteries.Init();
                base.OnConfiguring(optionsBuilder);
            }
        }

这可以通过安装 nuGet 包 Microsoft.EntityFrameworkCore.Sqlite 来解决(注意,不是 Microsoft.EntityFrameworkCore.Sqlite.Core)

可能是我的上述回答会在流程开始工作时对某人有所帮助

后来发现更多问题,在我们的案例中,主要项目的 bin 文件夹中有几个 Dll 不存在 window 应用程序 bin 文件夹

我是 WPF 和 WCF 项目,所以 Dll 总是被复制到 WCF 输出而不是 WPF 输出

为了解决这个问题,我将包含 e_sqlite3.dll 个二进制文件的 x64、x86 文件夹复制到项目根目录 现在转到 Visual studio 并单击 x64、x86 文件夹中的文件并选择 复制到输出目录如果较新则复制

丢失的二进制文件是 - e_sqlite3.dll

有关详细信息,请参阅随附的屏幕截图。

我最终通过替换

使它起作用
SQLitePCL.Batteries.Init();

SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());

(见https://github.com/ericsink/SQLitePCL.raw/wiki/SQLitePCL.Batteries.Init

不过,我最近检查了旧代码,试图回溯我的步骤来验证以前的一些答案。我收到以下错误:

System.DllNotFoundException -- Unable to load DLL 'e_sqlite3': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

环顾四周(例如 https://github.com/ErikEJ/SqlCeToolbox/issues/599),这个问题的解决方案似乎是简单地更新 sqlite-net。我更新到最新的稳定版本(1.5.231,在 1.2.0 上),对 Init 的原始调用以及我之前对 SetProvider 的修复都按预期工作。