HOWTO:带有EntityFramework和Code-First的SQLite

我正在尝试使用EF动态创建嵌入式SQLite数据库但是,我无法使其工作,数据库文件永远不会被创建。

我有EF 4.2和最新版本的SQLite

这就是我所拥有的

的app.config

               

数据库初始化程序(放入一些内容)

 class PageDbInitializer : DropCreateDatabaseAlways { 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 Pages { get; set; } } 

最后在主()

 Database.SetInitializer( new PageDbInitializer() ); 

我相信我有一些步骤缺失,但无法找到它们。

System.Data.SQLite在当前版本中仅与EFv1兼容的提供程序( 1,2 )。 这意味着它没有EFv4(EFv4.2是EFv4的包装)function,包括数据库创建和删除(检查MSDN中 .NET 3.5和.NET 4.0的DbProviderServices差异)。 因此,在使用SQLite时,不能首先使用代码自动创建数据库。 您必须手动创建数据库和所有表。

作为替代方案,您可以为SQLite使用不同的提供程序。 例如, Devart的SQLite提供 r声明,它支持EFv4和4.1,从而支持数据库创建。

看一下这个:

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( Database.Connection.ConnectionString, modelBuilder); Database.SetInitializer(sqliteConnectionInitializer); } }