【问题标题】:Entity Framework Core SQLite Connection String Keyword not supported: version不支持实体框架核心 SQLite 连接字符串关键字:版本
【发布时间】:2019-03-25 20:35:31
【问题描述】:

我使用 .NET Core 2.2 使用 SQLite 数据库创建了一个 ASP.NET MVC 网站。到目前为止,它运作良好。当我想向连接字符串添加特定于 SQLite 的关键字时,麻烦就开始了,例如

Data Source=~\\App_Data\\MyDb.db; Version=3; DateTimeFormat=UnixEpoch; DateTimeKind=Utc

现在我明白了

不支持关键字:'版本'

我这样注册数据库

// ConfigureServices(IServiceCollection services)
var conn = Configuration.GetConnectionString("MyDB").Replace("~", _env.ContentRootPath);
services.AddDbContext<MyDBContext>(options => options.UseSqlite(conn));

那么MyDBContext就有了

public partial class MyDBContext : DbContext
{
    public MyDBContext() { }

    public SatrimonoContext(DbContextOptions<MyDBContext> options)
        : base(options) { }

    public virtual DbSet<Book> Book { get; set; }
}

然后我在我的页面模型中使用它

private SatrimonoContext _db;

public BookAccuracyListModel(SatrimonoContext dbContext)
{
    _db = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}

从那里我可以通过 LINQ 正常访问 _db。

在发帖之前,我对该主题进行了大量研究,我发现最好的回复是this

此提供程序是 Microsoft.Data.Sqlite。这些连接字符串是 对于 System.Data.SQLite。

我们支持以下关键字:缓存、数据源、模式。

this

我遇到的问题是因为我试图创建一个 SqlConnection 而不是 SQLiteConnection。解决这个变化 我的问题。

但是,如果我做得“正确”,我就不会创建 SqlConnection,因此无法将其更改为 SQLiteConnection。另一个响应不包含解决方案。

那么我怎样才能让它以正确的方式工作呢?

【问题讨论】:

  • 如果您发现文档说唯一支持的关键字是 x、y 和 z,为什么您认为使用其他关键字会神奇地起作用?我唯一能想到的就是不要使用Microsoft.Data.Sqlite,这可能意味着你不能使用 EF Core

标签: c# sqlite entity-framework-core


【解决方案1】:

Github 中有一个关于该问题的线程。

Microsoft.Data.Sqlite只支持三个关键字:

  • 缓存 - 私有或共享
  • 数据源 - 数据库文件。可以是 URI 文件名。
  • 模式 - ReadWriteCreate、ReadWrite、ReadOnly 或 Memory。

此命名空间不支持其他关键字,但是如果您使用您在 System.Data.SQLite 命名空间中提到的关键字,它将起作用,因为它们是与 System.Data.SQLite 匹配的关键字。

你的两个选择:

  1. 从连接字符串中删除 Version=3 关键字或任何其他不受支持的关键字
  2. 更改您用于SQlite 连接的命名空间。

【讨论】:

  • System.Data.SQLite 是否与 Entity Framework Core 兼容?
  • 是的,您可以将包添加到您的项目中,请关注此线程:stackoverflow.com/questions/39903863/…
  • 我尝试将 System.Data.SQLite.Core 和 System.Data.SQLite 添加到 .NET Core 2.2。项目和命名空间不可用。也许它与 .NET Core 不兼容?
  • 哦,关闭 Visual Studio 并重新打开修复它。它有时会出错。
【解决方案2】:

扩展 Barr 的响应,解决方案是将 System.Data.SQLite.Core 添加到项目中。

然后替换

var conn = Configuration.GetConnectionString("Satrimono").Replace("~", _env.ContentRootPath);
services.AddDbContext<SatrimonoContext>(options => options.UseSqlite(conn));

var connString = Configuration.GetConnectionString("Satrimono").Replace("~", _env.ContentRootPath);
var conn = new SQLiteConnection(connString);
services.AddDbContext<SatrimonoContext>(options => options.UseSqlite(conn));

就是这样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2017-08-19
    相关资源
    最近更新 更多