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

时间:2019-03-24 13:11:32

标签: c# sqlite entity-framework-core

我使用SQLite数据库使用.NET Core 2.2创建了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。另一个回应不包括解决方案。

那么如何使它正确工作?

2 个答案:

答案 0 :(得分:3)

Github中有一个与此问题有关的话题。

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

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

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

您的两个选择:

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

答案 1 :(得分:1)

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

就是这样!