实体框架7 - 在迁移结束时运行种子

时间:2016-05-20 06:49:37

标签: c# entity-framework entity-framework-core

我有一个迁移类:

public partial class TestMigration : Migration
{
    protected override void Up(MigrationBuilder db)
    {

在Up方法结束时,我想添加一些数据(种子)。 MigrationBuilder公开了一些方法,也是Sql(),但我想使用EF。

我可以在这里注入DbContext并做一些事情吗?

2 个答案:

答案 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之后,所以我现在暂不打赌。