Entity Framework 6 с SQLite 3 Code First - не будет создавать таблицы

.net ef-code-first entity-framework-6 sqlite system.data.sqlite

Вопрос

Использование последних версий EF6 и SQLite от NuGet. Я, наконец, получил файл app.config для работы после некоторых полезных сообщений в Stackoverflow. Теперь проблема в том, что таблицы не создаются, хотя база данных.

Мой app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite"
                type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <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" />
      <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" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="MyDBContext"
          connectionString="Data Source=|DataDirectory|MyDB.sqlite"
          providerName="System.Data.SQLite" />
  </connectionStrings>
</configuration>

Моя простая тестовая программа:

class Program
{
    static void Main(string[] args)
    {
        using (var db = new MyDBContext())
        {
            db.Notes.Add(new Note { Text = "Hello, world" });
            db.Notes.Add(new Note { Text = "A second note" });
            db.Notes.Add(new Note { Text = "F Sharp" });
            db.SaveChanges();
        }

        using (var db = new MyDBContext())
        {
            foreach (var note in db.Notes)
            {
                Console.WriteLine("Note {0} = {1}", note.NoteId, note.Text);
            }
        }

        Console.Write("Press any key . . . ");
        Console.ReadKey();
    }

    public class Note
    {
        public long NoteId { get; set; }
        public string Text { get; set; }
    }

    public class MyDBContext : DbContext
    {
        // default constructor should do this automatically but fails in this case
        public MyDBContext()
            : base("MyDBContext")
        {

        }
        public DbSet<Note> Notes { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

Если я создам таблицу вручную, программа отлично работает, и таблица обновляется. Если я удалю базу данных, EF создаст ее, но не создаст таблицу, и программа завершится с ошибкой, когда она попытается прочитать данные с сообщением об ошибке, что таблица не существует.

Кому-нибудь удалось получить Code First, работающий с EF6? Поблагодарите помощь / руководство по этому поводу, поскольку я сейчас полностью застрял !!!

Спасибо всем.

Принятый ответ

К сожалению, реализация поставщика EF6 в System.Data.SQLite.EF6 не поддерживает создание таблиц. Я загрузил исходный код SQLite, чтобы посмотреть, но не смог найти ничего для создания таблиц и для переноса. Поставщик EF6 в основном такой же, как и их реализация Linq, поэтому он направлен на запрос базы данных, а не ее модификацию.

В настоящее время я выполняю всю свою работу с SQL Server и генерирую SQL-скрипты для SQLite с помощью SQL Server Compact & SQLite Toolbox . Затем скрипты можно запустить с помощью SQLiteCommand для имитации миграции.

Обновить

В EF7 поддержка SQL Server compact была отброшена, и новый разработчик SQLite разрабатывается командой EF. Поставщик будет использовать управляемый Microsoft SQLite проект оболочки, Microsoft.Data.SQLite а не проект System.Data.SQLite . Это также позволит использовать EF7 на iOS, Android, Windows Phone / Mobile, Linux, Mac и т. Д., Поскольку оболочка Microsoft разрабатывается как переносная библиотека.

Это все еще в бета-версии, но вы можете получить пакеты nuget из фидов разработки ASP.Net в MyGet ( dev , master , release ), если хотите посмотреть. Найдите пакет EntityFramework.SQLite .


Популярные ответы

Я начал с кода из жареного и создал проект, который позволяет использовать CodeFirst. Проект доступен с открытым исходным кодом на GitHub или в виде пакета NuGet .

Если у вас возникнут какие-либо проблемы или пропустите эту функцию, не стесняйтесь открывать новую проблему в GitHub . Конечно, PR приветствуются.

Изменить (26.04.2016):

Тем временем я много сделал в этом проекте.

Поддерживаются следующие функции (по умолчанию EF):

  • Таблицы из классов (поддерживаемые аннотации: таблица)
  • Столбцы из свойств (поддерживаемые аннотации: столбец, ключ, максимальная длина, обязательный, не отображаемый, генерируемый Database, индекс)
  • Ограничение PrimaryKey (ключевые аннотации, ключевые композиты поддерживаются)
  • Ограничение ForeignKey (отношения 1-n, поддержка «Cascade on delete»)
  • Не нулевое ограничение
  • Автоматическое увеличение (int PrimaryKey будет автоматически увеличиваться)
  • Индекс (украсить столбцы с помощью атрибута «индекс». Индексы автоматически создаются для внешних ключей по умолчанию. Чтобы этого избежать, вы можете удалить конформизм ForeignKeyIndexConvention)

Есть также некоторые функции, исключительные для SQLite, которые по умолчанию не поддерживаются:

  • Уникальное ограничение (украсить столбцы UniqueAttribute, который является частью этой библиотеки)
  • Ограничить ограничение (украсить столбцы с помощью атрибута CollateAttribute, который является частью этой библиотеки)

Существует два способа использования функциональных возможностей этой библиотеки.

  1. Используйте DbInitializers:

    • SqliteCreateDatabaseIfNotExists
    • SqliteDropCreateDatabaseAlways
    • SqliteDropCreateDatabaseWhenModelChanges
  2. Получите больше контроля, используя один из следующих двух классов:

    • SqliteSqlGenerator (создает SQL на основе EdmModel)
    • SqliteDatabaseCreator (создает новую базу данных SQLite на основе базы данных и DbModel)



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему