实体框架核心 SQLite 连接字符串不支持关键字:version

12

我使用 .NET Core 2.2 创建了一个 ASP.NET MVC 网站,并使用 SQLite 数据库。到目前为止,一切顺利。但是当我想在连接字符串中添加 SQLite 特定关键字时,问题就开始了,例如:

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

现在我明白了

关键字不受支持:'version'

我像这样注册数据库

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

然后,我的DBContext有

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。

在发布这里之前,我对这个主题进行了大量研究,我找到的最好的答复是这个

这个提供程序是Microsoft.Data.Sqlite。那些连接字符串是System.Data.SQLite的。

我们支持以下关键字:Cache、Data Source、Mode。

这个

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

然而,如果我做得“正确”,我不会创建SqlConnection,因此无法将其更改为SQLiteConnection。另一个回复没有提供解决方案。

那么如何以正确的方式使其工作?


1
如果你发现文档中只列举了关键词x、y和z,你为什么会认为使用其他的关键词能够奇迹般地工作呢?我唯一想到的方法就是不使用Microsoft.Data.Sqlite,但这意味着你可能无法使用EF Core。 - Camilo Terevinto
2个回答

9

关于该问题在Github上有一个讨论帖子。

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

  • Cache - 私有或共享
  • Data Source - 数据库文件。可以是URI文件名。
  • Mode - ReadWriteCreate、ReadWrite、ReadOnly或Memory。

对于该命名空间,不支持其他的关键字,但如果您使用了System.Data.SQLite命名空间中匹配的关键字,则会起作用。

您有两个选择:

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

System.Data.SQLite是否与Entity Framework Core兼容? - Etienne Charland
是的,您可以将该软件包添加到您的项目中,请按照此线程操作:https://dev59.com/5FkS5IYBdhLWcg3waWDE - Barr J
我尝试将System.Data.SQLite.Core和System.Data.SQLite添加到.NET Core 2.2项目中,但命名空间仍然无法使用。也许它与.NET Core不兼容? - Etienne Charland
1
哦,关闭 Visual Studio 并重新打开就解决了。有时候会出现 bug。 - Etienne Charland

5
扩展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));

就是这样!


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