Подтвердить что ты не робот

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

Использование последних версий 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? Поблагодарите помощь/руководство по этому поводу, поскольку я сейчас полностью застрял!!!

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

4b9b3361

Ответ 1

К сожалению, реализация поставщика 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.

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

Я решил написать свой собственный рудиментарный инициализатор базы данных для решения этой проблемы.

Вы можете проверить это здесь: https://gist.github.com/flaub/1968486e1b3f2b9fddaf

Он поддерживает:

  • Связи Many-to-Many
  • Аннотации данных Code-First, такие как:
    • [Key]
    • [Требуется]
    • [Индекс]
    • [ForeignKey]