在Entity Framework 4.3中增加种子数据的最佳方法

我一直在使用entity framework4.3在一个现有的数据库,我有几个场景,我试图迎合。

首先,如果我删除我的数据库,我想EF重新创build,如果从头开始 – 我已经成功地使用CreateDatabaseIfNotExists数据库初始化程序。

其次,如果我更新我的模型和数据库已经存在,我想数据库自动更新 – 我已经成功地使用entity framework4.3迁移为此。

所以这是我的问题。 假设我在我的模型中添加了一个新的表格,这个表格需要一些参考数据,确保在数据库初始化器运行时以及迁移运行时创build这个数据的最好方法是什么。 我的愿望是,当我从头开始创build数据库时,以及数据库由于运行迁移而被更新时,数据被创build。

在一些EF迁移的例子中,我看到人们在迁移的UP方法中使用SQL()函数来创build种子数据,但是如果可能的话,我宁愿使用上下文来创build种子数据(就像你在大多数数据库初始化例子中看到的那样)因为在我看来,当EF的整个想法正在抽象出来的时候,你会使用纯SQL。 我试图在UP方法中使用上下文,但由于某种原因,当我尝试在调用下方直接添加种子数据以创build表时,它并不认为在迁移中创build的表存在。

任何智慧不胜感激。

如果您想使用实体为数据创build种子,则应在迁移configuration中使用Seed方法。 如果你生成了新的项目Enable-Migrations你将得到这个configuration类:

 internal sealed class Configuration : DbMigrationsConfiguration<YourContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(CFMigrationsWithNoMagic.BlogContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. Eg // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // } } 

移植种子数据的方式效率不高,因为它被用于一些非常基础的播种。 每次更新到新版本都会经历整个集合,并尝试更新现有数据或插入新数据。 如果您不使用AddOrUpdate扩展方法,则必须手动确保只有在数据不存在的情况下才会将数据播种到数据库。

如果你想有效的播种方式,因为你必须种子很多的数据,你会得到更好的结果与共同:

 public partial class SomeMigration : DbMigration { public override void Up() { ... Sql("UPDATE ..."); Sql("INSERT ..."); } public override void Down() { ... } } 

我不推荐在你的Up()方法中使用Sql()调用,因为(IMO)这实际上是用于没有内置函数而不是种子代码的实际迁移代码。

我喜欢将种子数据看作是未来可能会改变的东西(即使我的模式没有),所以我只是在种子函数中对所有插入内容进行“防御”检查,以确保操作没有触发先前。

考虑一个情况,你有一个“types”表,开始有3个条目,但你后来添加一个第四。 你不应该需要一个“迁移”来解决这个问题。

使用Seed()也给你一个完整的上下文来处理,这比在Ladislav演示的Sql()方法中使用普通的sqlstring要好得多。

另外,请记住,使用内置EF方法的迁移代码和种子代码的好处是您的数据库操作保持平台中立。 这意味着您的模式更改和查询能够在Oracle,Postgre等上运行。如果您编写实际的原始SQL,那么您可能会将自己locking在不必要的地方。

你可能不太关心这个问题,因为90%的使用EF的人只会碰到SQL Server,但我只是把它扔在那里给你一个不同的解决scheme的angular度。