无法在ASP.NET MVC中运行SQLite.net PCL

4
我正在尝试使用Frank A. Krueger的SQLite.net PCL,并尝试将其用作Android应用程序和ASP.NET MVC Web应用程序的通用数据层。在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 Web应用程序中运行SQLite.net PCL,或者我需要寻找不同的数据源?

你在使用哪个SQLitePCL项目?有太多的选择了。 - Searching
Frank A. Krueger - https://github.com/praeclarum/sqlite-net - Bondolin
6个回答

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

谢谢,对我没用。在这个问题的背景下,我正在使用PCL针对不兼容的框架。我尝试安装你提到的版本(2.1.4,截至你的回答最新版本),但出现了以下错误:无法安装包'Microsoft.EntityFrameworkCore.Sqlite 2.1.4'。您正在尝试将此软件包安装到一个目标为'.NETFramework,Version=v4.6'的项目中,但该软件包不包含任何与该框架兼容的程序集引用或内容文件。有关更多信息,请联系软件包作者。 - Bondolin

1

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

虽然我对这个解决方案不满意,想要深入挖掘,但现在暂时采用这个解决方案 -

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);
            }
        }

1
难以置信,这为我解决了问题。但我不明白为什么需要这样做? - jhaagsma
1
这背后有各种原因,而且你必须看到我下面发布的另一个跟进答案,因为后来我遇到了更多困难。我在此期间学到的是NuGet包引起了这个问题。其中有一些我们需要使用正确的版本。还要记住,每次请求我的API时,我从未得到optionsBuilder.IsConfigured为true,所以if条件内的代码始终在执行。稍后我会进行调整。此外,sqllite版本也很重要。我想我用的是V2。 - TARJU

1

1

I eventually got this to work by replacing

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的修复都能按预期工作。


0

也许我的上面的回答可以帮助某个人,因为进程开始工作了

后来发现更多问题,即少了一些DLL,这些DLL不在主项目的bin文件夹中,在我们的情况下是窗口应用程序bin文件夹

我有WPF和WCF项目,所以DLL始终被复制到WCF输出而不是WPF输出

为了解决这个问题,我将包含e_sqlite3.dll二进制文件的x64、x86文件夹复制到项目根目录中 现在去Visual Studio,点击x64、x86文件夹中的文件,选择“复制到输出目录”,如果更新则进行复制

缺少的二进制文件是-e_sqlite3.dll

有关更多详细信息,请参见附加的截图。 这张图片更详细地阐述了问题


0
你尝试过将SQLitePCLRaw捆绑包之一添加到你的项目中吗?
我发现,在构建引用了SQLite-net的可移植项目的UWP项目时,需要在解决方案中的两个项目中都添加SQLitePCLRaw捆绑包,以便执行Batteries.Init()调用。
异常消息中有关于这种设置的提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接