【问题标题】:SQLite with MVC Core带有 MVC 核心的 SQLite
【发布时间】:2018-07-29 08:36:08
【问题描述】:

我正在尝试在内存中创建数据库并使用 .NET Core 2.1 框架运行查询。为此,我安装了一个名为 Microsoft.Data.Sqlite.Core 的软件包,然后尝试执行以下操作:

var connection = new SqliteConnection("Data Source=:memory:");
connection.Execute("Some Create Table Query");

我的代码将崩溃并出现以下错误:

您需要调用 SQLitePCL.raw.SetProvider()。如果您使用的是捆绑包,则通过调用 SQLitePCL.Batteries.Init() 来完成。

为了找到解决方案,我做了很多挖掘工作,其中一个建议这样称呼:

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

这给我带来了一个新错误:

'无法加载 DLL 'e_sqlite3' 或其依赖项之一:找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E)'

在这一点上我真的很迷茫如何做到这一点。我要做的就是创建一个内存数据库,这样我就可以运行一些查询以进行单元测试。

我不确定这是否相关,但我没有使用 EF6,我使用的是 Dapper,而且我在我的实际项目中使用的是 SQL Server。我想在单元测试中插入 Sqlite,这样我也可以测试我的查询。

我感觉我使用了错误的包,但是环顾四周,我找不到任何关于如何在 MVC Core 项目中使用 Sqlite 的明确文档。

【问题讨论】:

  • 我本来打算推荐 DbContextOptionsBuilder.UseInMemoryDatabase(string),但是你不能在内存数据库中使用 DatabaseFacade.ExecuteSqlCommand(),因为它不是关系数据库!

标签: c# sqlite asp.net-core


【解决方案1】:

尝试将SQLitePCLRaw.bundle_green 包添加到您的项目中。

dotnet add package SQLitePCLRaw.bundle_green

此时,以下程序 (inspired by this) 可以运行:

using Microsoft.Data.Sqlite;

class Program
{
    static void Main()
    {
        var connection = new SqliteConnection("Data Source=:memory:");
        connection.Open();

        var createCommand = connection.CreateCommand();
        createCommand.CommandText =
        @"
            CREATE TABLE data (
                value TEXT
            )
        ";

        createCommand.ExecuteNonQuery();
    }
}

这是我在本地运行的测试。

cd C:/temp
dotnet new console
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_green
//
// paste the above program into Program.cs, then...
//
dotnet run 

什么是 bundle_green? bundle_green 是 Sqlite “捆绑包”之一,专门用于简化跨平台开发。这是来自the official repository的描述:

这些包会自动为每个平台引入正确的依赖项。它们还提供了对所有平台都相同的单个 Init() 调用... SQLitePCLRaw.bundle_green 是一个在除 iOS 之外的任何地方都使用 e_sqlite3 的包,其中使用了系统提供的 SQLite。

【讨论】:

  • SQLitePCLRaw.bundle_green mvc 核心友好吗?如在,它不会依赖于 Windows。尝试将我的框架保持在核心上,而不是将其与 .net 混淆。
  • 添加 Microsoft.Data.Sqlite 和 Microsoft.Data.Sqlite.Core 就足够了,无需手动添加其他内容,至少 .NET core 2.2 SDK 是这样。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2013-04-21
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
相关资源
最近更新 更多