Entity Framework Core SQLite Строка подключения Ключевое слово не поддерживается: версия - PullRequest
1 голос
/ 24 марта 2019

Я создал сайт ASP.NET MVC, используя .NET Core 2.2, используя базу данных SQLite.Пока все работает хорошо.Проблема начинается, когда я хочу добавить специфичные для 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));
}

иоттуда я могу нормально получить доступ к _db через LINQ.

Перед публикацией здесь я провел много исследований по этой теме, и лучшие ответы, которые я нашел, были this

Этот провайдер - Microsoft.Data.Sqlite.Эти строки подключения предназначены для System.Data.SQLite.

Мы поддерживаем следующие ключевые слова: кэш, источник данных, режим.

и this

Проблема, с которой я столкнулся, заключалась в том, что я пытался создать SqlConnection вместо SQLiteConnection.Выполнение этого изменения решило мою проблему.

Однако, если я делаю это "правильно", я не создаю SqlConnection и, следовательно, не могу изменить его на SQLiteConnection.Другой ответ не включает решение.

Так как мне заставить это работать правильно?

Ответы [ 2 ]

3 голосов
/ 24 марта 2019

В теме Github есть сообщение о проблеме.

Microsoft.Data.Sqlite поддерживает только три ключевых слова:

  • Кэш - Частный или общий
  • Источник данных - Файл базы данных. Может быть именем файла URI.
  • Режим - ReadWriteCreate, ReadWrite, ReadOnly или Memory.

Другие ключевые слова для этого пространства имен не поддерживаются, однако, если вы используете ключевые слова, которые вы упомянули с пространством имен System.Data.SQLite, оно будет работать, так как они являются ключевыми словами, подходящими для System.Data.SQLite.

Ваши два варианта:

  1. Удалите ключевое слово Version=3 или любое другое неподдерживаемое ключевое слово из строки подключения
  2. Измените пространство имен, которое вы используете для подключения SQlite .
1 голос
/ 25 марта 2019

Расширяя ответ Барра, решение заключается в добавлении 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));

Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...