我有一个迁移类:
public partial class TestMigration : Migration
{
protected override void Up(MigrationBuilder db)
{
在Up方法结束时,我想添加一些数据(种子)。 MigrationBuilder公开了一些方法,也是Sql(),但我想使用EF。
我可以在这里注入DbContext并做一些事情吗?
答案 0 :(得分:4)
我不建议您在迁移中向上或向下播种数据库。这是一种不好的做法。
您可以在up / down方法中执行Sql语句,并按如下方式对表进行播种:
EF6:
public override void Up()
{
Sql("INSERT INTO Customers (CustomerName, ContactName) VALUES ('Cardinal','Tom B.')");
...
}
EF Core 1.0 / 7:
protected override void Up(MigrationBuilder db)
{
db.Sql("INSERT INTO Customers (CustomerName, ContactName) VALUES ('Cardinal','Tom B.')");
}
其中客户是DbSet的实体<'客户'>客户通过 DbContext
您可以在迁移期间通过提供连接字符串或从配置中加载它来创建DbContext但认为该数据库此时尚未完成且更新进度仍在使用中。这件事可能会让你以后真的很麻烦。
1)使用普通的DBInitializer.Seed将数据播种到数据库。
2)使用迁移向上/向下的Sql语句转换(更新/删除/插入)数据,并在迁移过程中使旧数据库模式与新数据库模式之间的数据兼容。
3)不要尝试在迁移过程中创建DbContext。
答案 1 :(得分:0)
在迁移期间无法修改数据。种子数据库的当前解决方案是在应用程序启动时执行此操作,如Unicode Store sample所示,确保所有seed data is available。
在issue 3042中对此进行了讨论,目前的努力似乎是改变迁移故事,以便在迁移过程中实现to seed data。它目前计划在RTM之后,所以我现在暂不打赌。