Простой пример с использованием System.Data.SQLite с Entity Framework 6

Я пытаюсь получить простой пример кода для работы в консольном приложении с использованием SQLite и EF6, однако я столкнулся с несколькими ошибками: Я создал новый консольный проект в VS 2015. Затем установите EF (6.1.3) и System.Data.SQLite(1.0.102) через NuGet.

Попробуйте запустить простую программу:

namespace SQLiteConsole1
{
    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    class MyContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyContext())
            {
                var person = new Person() { Name = "John" };
                db.Persons.Add(person);
                db.SaveChanges();
            }
        }
    }
}

Вот что мой App.Config выглядит так:

  <connectionStrings>
    <add name="MyContext" connectionString="Data Source=C:\Temp\Test.sqlite" providerName="System.Data.SQLite" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    <remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories>
  </system.data>

Когда я впервые запускаю эту программу, я получаю следующую ошибку:

"Необработанное исключение: System.InvalidOperationException: поставщик провайдера ADO.NET не найден с провайдером ADO.NET с инвариантным именем" System.Data.SQLite ". Убедитесь, что поставщик зарегистрирован в разделе" entityFramework "файла конфигурации приложения."

Итак, я меняю <provider invariantName="System.Data.SQLite.EF6" на <provider invariantName="System.Data.SQLite", затем получаю эту ошибку:

Необработанное исключение: System.Data.Entity.Infrastructure.DbUpdateException: Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение. System.Data.Entity.Core.UpdateException: Произошла ошибка во время обновление записей. Подробнее см. Внутреннее исключение. System.Data.SQLite.SQLiteException: ошибка логики SQL или отсутствует база данных нет такой таблицы: Люди

Что нужно изменить, чтобы этот простой пример работал?

Ответы

Ответ 1

Аналогичный вопрос задается здесь: Entity Framework 6 с SQLite 3 Code First - не будет создавать таблицы

kjbartel дает очень полезное объяснение, что создание таблицы не поддерживается драйвером EF SQLite.

Также см. https://github.com/msallin/SQLiteCodeFirst, что обеспечивает отличное решение. Я установил пакет SQLite.CodeFirst NuGet и добавил код ниже, тогда приложение отлично работает:

    class MyContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
        public DbSet<Person> Persons { get; set; }
    }

Ответ 2

Вам нужно инициализировать свою базу данных таблицами для ваших моделей. Обратите внимание на ошибку "Ошибка логики SQL или отсутствующая база данных нет такой таблицы: Люди".

Это означает, что вам нужно запустить SQL для создания соответствующих таблиц в базе данных, к счастью, если вы используете VS, в контекстном меню, находясь в редакторе модели (*.edmx файлы), есть опция, сгенерировать SQL и выполнить его для создания записей в базе данных в базе данных для вас на основе модели. Примечание: иногда автогенерация для не-MS-SQL может иметь проблемы, которые необходимо исправлять вручную, прежде чем они будут компилироваться/выполняться.