问题 实体框架在迁移之前执行SQL


我正在开发一个使用Entity-Framework 6代码优先的现有项目。我需要在迁移运行之前运行一些SQL。

我有一个带有种子方​​法的DbMigrationsConfiguration类,但种子在迁移后运行。

我认为如果我在构造函数中运行SQL但它无法获取对上下文的引用,它将起作用。

有谁知道如何做到这一点?


6443
2017-10-23 18:48


起源



答案:


您可以在所需的迁移类中使用“Sql”方法。

public partial class OneOfYourMigrations : DbMigration 
{ 
    public override void Up() 
    { 
        //EF generated migration code here such as
        //CreateTable or AddColumn etc...
        //Now run your custom sql - here I'm doing an update to an existing column
        Sql("UPDATE dbo.YourTable SET Column1 = 'VALUE1' "); 
    } 

    public override void Down() 
    { 
        //EF generated code to rollback
    } 
}     

所以步骤是;

  • 使用Add-Migration生成迁移类
  • 使用类似于上面的代码更改类
  • 使用Update-Database运行迁移

15
2017-10-25 22:34



你能解释一下细节吗?我认为迁移只运行一次。如果它每次都会运行,但它似乎只运行一次,这将有效。 - Don Chambers
如果我知道你想要运行什么样的SQL,我可能会更具体一些吗?是修改数据(如我上面提到的)还是其他的东西?仅供参考,给定的迁移针对给定的数据库运行一次,但您始终可以回滚给定的迁移 - 更改它(即添加Sql)并再次运行它。 - Uchitha
想要运行脚本吗? stackoverflow.com/questions/32125937/... - JackMorrissey


答案:


您可以在所需的迁移类中使用“Sql”方法。

public partial class OneOfYourMigrations : DbMigration 
{ 
    public override void Up() 
    { 
        //EF generated migration code here such as
        //CreateTable or AddColumn etc...
        //Now run your custom sql - here I'm doing an update to an existing column
        Sql("UPDATE dbo.YourTable SET Column1 = 'VALUE1' "); 
    } 

    public override void Down() 
    { 
        //EF generated code to rollback
    } 
}     

所以步骤是;

  • 使用Add-Migration生成迁移类
  • 使用类似于上面的代码更改类
  • 使用Update-Database运行迁移

15
2017-10-25 22:34



你能解释一下细节吗?我认为迁移只运行一次。如果它每次都会运行,但它似乎只运行一次,这将有效。 - Don Chambers
如果我知道你想要运行什么样的SQL,我可能会更具体一些吗?是修改数据(如我上面提到的)还是其他的东西?仅供参考,给定的迁移针对给定的数据库运行一次,但您始终可以回滚给定的迁移 - 更改它(即添加Sql)并再次运行它。 - Uchitha
想要运行脚本吗? stackoverflow.com/questions/32125937/... - JackMorrissey