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);
}
}
DbContext:
class PageDB : DbContext
{
public DbSet<WebPage> Pages { get; set; }
}
И, наконец, в главном()
Database.SetInitializer( new PageDbInitializer() );
Я считаю, что у меня есть некоторые шаги, но они не могут найти их.
Ответы
Ответ 1
System.Data.SQLite
находится в текущей версии только совместимый с EFv1 провайдер (1, 2). Это означает, что EFv4 (EFv4.2 не является оболочкой вокруг EFv4), включая создание и удаление базы данных (проверьте различия DbProviderServices
для .NET 3.5 и .NET 4.0 в MSDN). Из-за этого вы не можете использовать автоматическое создание базы данных с кодом при работе с SQLite. Вы должны создать базу данных и все таблицы вручную.
В качестве альтернативы вы можете использовать другой провайдер для SQLite. Например Devart SQLite предоставляет, утверждает, что поддерживает EFv4 и 4.1 и, следовательно, создает базу данных.
Ответ 2
Проверьте это:
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);
}
}