【问题标题】:Cannot run SQLite.net PCL in ASP.NET MVC无法在 ASP.NET MVC 中运行 SQLite.net PCL
【发布时间】:2016-11-03 23:35:46
【问题描述】:

Frank A. Krueger 的SQLite.net PCL 让我大吃一惊。我正在尝试将它用作 Android 应用程序以及 ASP.NET MVC Web 应用程序的通用数据层。我在使用 Android 方面取得了一些成功,但在尝试将其用于网络应用程序时,我得到了以下异常:

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,还是我必须寻找不同的数据源?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 谢谢,对我没用。在这个问题的上下文中,我使用的是针对不兼容框架的 PCL。我在尝试安装我猜是您所指的版本时遇到以下错误(2.1.4,您回答时的最新版本):无法安装包'Microsoft.EntityFrameworkCore.Sqlite 2.1.4'。您正在尝试将此包安装到以“.NETFramework,Version=v4.6”为目标的项目中,但该包不包含任何与该框架兼容的程序集引用或内容文件。如需更多信息,请联系包作者。
【解决方案2】:

我有同样的问题,我通过导入解决了它

SQLitePCLRaw.bundle_e_sqlite3
SQLitePCLRaw.bundle_sqlcipher
SQLitePCLRaw.bundle_green

参考

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

【讨论】:

    【解决方案3】:

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

    虽然我对这个解决方案不满意,我想深入挖掘,但现在继续推进这个解决方案 -

    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 包。其中有一些,我们需要使用正确的。还要记住,每次向我的 API 发出请求时,我从来没有将 optionsBuilder.IsConfigured 设置为 true,因此 if 条件中的代码一直在执行。我稍后会调整的东西。而且它的sqllite版本也很重要。我猜我在 V2 上。
    【解决方案4】:

    我最终通过替换来实现这个功能

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        我的上述答案可能会在流程开始工作时帮助某人

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-01-09
          • 1970-01-01
          • 1970-01-01
          • 2015-12-15
          • 2015-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多