HOWTO: SQLite с EntityFramework и Code-First

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

У меня EF 4.2 и последняя версия SQLite

Вот что у меня есть

app.config

<?xml version="1.0"?>
<configuration>
  <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"/>
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="DataContext"
         connectionString="Data Source=test.db;Version=3;New=True;"
         providerName="System.Data.SQLite" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

Инициализатор БД (для добавления контента)

class PageDbInitializer : DropCreateDatabaseAlways<PageDB>
{
    protected override void Seed(PageDB context)
    {
        for (int i = 0; i < 10; i++)
        {
            WebPage page = new WebPage() { Name = "Page" + (i + 1) };
            context.Pages.Add(page);
        }
        base.Seed(context);
    }
}

Дбконтекст:

class PageDB : DbContext
{
        public DbSet<WebPage> Pages { get; set; }
}

И, наконец, в main()

Database.SetInitializer( new PageDbInitializer() );

Я считаю, что у меня отсутствуют некоторые шаги, но я не могу их найти.


person Pierluc SS    schedule 15.11.2011    source источник
comment
Просто из любопытства, что вы в итоге сделали? вы использовали провайдера devart или нашли другое решение?   -  person Justin Dalrymple    schedule 27.06.2013
comment
@StellaMusik В итоге я пока использовал SQLExpress, но вы всегда можете сначала использовать модель или базу данных с SQLlite.   -  person Pierluc SS    schedule 27.06.2013
comment
@PierlucSS столкнулся с той же проблемой. Я не хочу использовать Devart's, так что, очевидно, это будет первая модель   -  person Haikal Nashuha    schedule 10.11.2013


Ответы (2)


System.Data.SQLite в текущей версии есть только поставщик, совместимый с EFv1 (1, 2). Это означает, что в нем нет функций EFv4 (EFv4.2 является оболочкой EFv4), включая создание и удаление базы данных (проверьте DbProviderServices различия между .NET 3.5 и .NET 4.0 в MSDN). Из-за этого вы не можете использовать автоматическое создание базы данных с кодом при работе с SQLite. Вы должны создать базу данных и все таблицы вручную.

В качестве альтернативы вы можете использовать другого провайдера для SQLite. Например, предоставление Devart SQLiter утверждает, что поддерживает EFv4 и 4.1 и, следовательно, создание базы данных.

person Ladislav Mrnka    schedule 14.12.2011
comment
Поскольку это старый пост, знаете ли вы, является ли он все еще действительным ответом? В настоящее время я пытаюсь найти информацию об этом, и в ходе моих исследований кажется, что это все еще верно (но я не уверен). - person Default; 15.10.2013
comment
Я могу убедиться, что даже не могу создать базу данных с текущим провайдером sqlite. - person user3141326; 28.01.2016
comment
@ user3141326: Можете ли вы попробовать EF Core (он же EF 7)? Он должен иметь встроенный провайдер для SQLite. - person Ladislav Mrnka; 01.02.2016

Проверь это:

https://github.com/msallin/SQLiteCodeFirst

Также доступен как NuGet.

Он добавляет некоторые инициализаторы БД в ваш ptoject, например SqliteCreateDatabaseIfNotExists

Вот пример веб-сайта:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("ConnectionStringName") { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(
            Database.Connection.ConnectionString, modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }
}
person Jerther    schedule 19.08.2015
comment
Работает отлично. Текущая версия (1.5.1.25) не нуждается в строке подключения, передаваемой в конструктор SqliteCreateDatabaseIfNotExists, только в построителе модели. - person Mark Feldman; 20.07.2018