我们可以使用代码优先迁移来运行SQL脚本吗?

时间:2015-08-20 18:41:47

标签: c# sql-server asp.net-mvc entity-framework asp.net-mvc-4

我们可以使用代码优先迁移来运行sql脚本吗?

我是新手代码,如果我想在迁移的update-database命令之前将更改保存到SQL脚本文件,是否可以?

如果可能,请提供完成工作的步骤。此外,如果生成脚本,那么我是否可以使用迁移运行该脚本?

4 个答案:

答案 0 :(得分:62)

首先,您需要创建迁移。

Add-Migration RunSqlScript

然后在生成的迁移文件中,您可以编写SQL。

// PLAIN SQL
Sql("UPDATE dbo.Table SET Created = GETDATE()");

// FROM FILE
var sqlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Custom.sql"); 
Sql(File.ReadAllText(sqlFile));

然后你运行

Update-Database

答案 1 :(得分:22)

我喜欢将SQL脚本作为资源嵌入到程序集中并使用SqlResource方法。我已经使用Visual Studio 2017 15.5.6测试了这种方法。

首先,您需要创建一个迁移文件:

  1. 在Visual Studio中,确保将已定义DbContext的项目设置为启动项目
  2. 在Visual Studio中打开PMC:View - >其他Windows - >包管理器控制台
  3. 在PMC中将默认项目设置为包含DbContext的项目
  4. 如果您同时安装了EF内核和EF 6.x:

    EntityFramework\Add-Migration RunSqlScript

  5. 如果您只安装了EF 6.x:

    Add-Migration RunSqlScript

  6. 在迁移文件夹中添加Sql脚本(我使用与迁移文件相同的前缀命名)

    Migration folder in the Solution Explorer

    在文件属性窗口中,确保构建操作是"嵌入式资源" 请注意,我们不需要复制到输出文件夹,因为sql脚本将嵌入到程序集中。

    更新RunSqlScript迁移

    中的Up方法
    public override void Up()
    {
        string sqlResName = typeof(RunSqlScript).Namespace  + ".201801310940543_RunSqlScript.sql";
        this.SqlResource(sqlResName );
    }
    

    我希望这会有所帮助

答案 2 :(得分:7)

与SQL一样,我们有另一种方法SqlFile。你可以直接使用它。

答案 3 :(得分:0)

对于.NET Core和EF Core,您可以在迁移中执行类似的操作

protected override void Up(MigrationBuilder migrationBuilder)
{
   var schema = "starter_core";
   migrationBuilder.Sql($"INSERT INTO [{schema}].[Roles] ([Name]) VALUES ('transporter')");
}