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

时间:2016-11-03 23:35:46

标签: c# asp.net asp.net-mvc sqlite portable-class-library

我和弗兰克A.克鲁格的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是一个不适用于ASP.NET平台的PCL库调用?)

有没有办法在ASP.NET Web应用程序中运行SQLite.net PCL,或者我将不得不寻找不同的数据源?

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

SQLitePCLRaw.bundle_e_sqlite3
SQLitePCLRaw.bundle_sqlcipher
SQLitePCLRaw.bundle_green

参考

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

答案 2 :(得分:0)

您是否尝试过在项目中添加一个SQLitePCLRaw包?

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

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

答案 3 :(得分:0)

我发现的当前解决方案是我必须像下面这样称呼...

尽管我对解决方案不满意,但我想进行深入研究,但现在继续使用该解决方案-

<script>
        document.getElementById('select-country').addEventListener('change', function () {
            document.getElementById('select-capital').getElementsByTagName('option')[this.selectedIndex].selected = true;
        });
</script>

答案 4 :(得分:0)

可能是我上面的答案,将在流程开始工作时帮助某人

后来发现了更多的问题,在本例中的窗口应用程序bin文件夹中,主项目的bin文件夹中没有很少的Dll

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

为解决此问题,我将包含e_sqlite3.dll二进制文件的x64,x86文件夹复制到了项目根目录 现在转到Visual Studio,然后单击x64,x86文件夹中的文件,然后选择 复制到输出目录副本(如果较新

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

有关更多详细信息,请参见附件的屏幕截图。 This image elaborates more regarding issue

答案 5 :(得分:0)

我最终通过替换

使它起作用
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的修复都按预期工作。