在Entity Framework 4.3中增加种子数据的最佳方法
我一直在使用实体框架4.3在一个现有的数据库,我有几个场景,我试图迎合。
首先,如果我删除我的数据库,我想EF来重新创建,如果从头开始 - 我已经成功地使用了CreateDatabaseIfNotExists数据库初始化程序。
其次,如果我更新我的模型,并且数据库已经存在,我希望数据库自动更新 - 我已经成功地使用了Entity Framework 4.3 Migrations。
所以这是我的问题。 假设我在我的模型中添加了一个需要一些参考数据的表格,这是确保在数据库首字母缩略词运行时以及迁移运行时创建这些数据的最佳方式。 我的愿望是,当我从头开始创建数据库时,以及数据库由于迁移运行而更新时,数据会被创建。
在一些EF迁移示例中,我看到人们在迁移的UP方法中使用SQL()函数来创建种子数据,但如果可能的话,我宁愿使用上下文来创建种子数据(正如您在大多数数据库初始化程序示例中所见)因为对于我来说,当EF的整个想法抽象出来时,你会使用纯SQL。 我试图在UP方法中使用上下文,但由于某种原因,当我试图在创建表的调用下方直接添加种子数据时,它并不认为在迁移中创建的表存在。
任何智慧都非常感谢。
如果您想使用实体为数据创建种子数据,则应在迁移配置中使用Seed
方法。 如果您生成新的项目Enable-Migrations
您将获得此配置类:
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. E.g.
//
// 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)这个实际的移植代码是没有内置函数的,而不是种子代码。
我喜欢将种子数据视为未来可能会改变的东西(即使我的模式不会),所以我只是在种子函数中对所有插入内容进行“防御性”检查,以确保操作没有触发先前。
考虑一个情况,你有一个“类型”表,开始有3个条目,但后来你添加了第4个。 你不应该需要一个“迁移”来解决这个问题。
使用Seed()
也给你一个完整的上下文来处理,这比在Ladislav演示的Sql()
方法中使用普通的sql字符串要好得多。
另外,请记住,为迁移代码和种子代码使用内置EF方法的好处是您的数据库操作保持平台中立。 这意味着您的模式更改和查询可以在Oracle,Postgre等上运行。如果您编写实际的原始SQL,那么您可能会以不必要的方式锁定自己。
你可能不太关心这个问题,因为90%的使用EF的人只会碰到SQL Server,但我只是把它扔在那里给你一个解决方案的不同观点。
链接地址: http://www.djcxy.com/p/62317.html上一篇: Best way to incrementally seed data in Entity Framework 4.3