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); } }