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

hfyxw5xn  于 2023-01-25  发布在  其他
关注(0)|答案(6)|浏览(98)

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

我是第一次接触代码,如果我想在迁移update-database命令之前将更改保存到SQL脚本文件,是否可以?
如果可能的话,请提供步骤来完成它。另外,如果脚本生成,那么我可以使用迁移运行该脚本吗?

wrrgggsh

wrrgggsh1#

首先,您需要创建迁移。

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
n3h0vuf2

n3h0vuf22#

我喜欢做的是将SQL脚本作为资源嵌入到程序集中,并使用SqlResource方法。我已经使用Visual Studio 2017 15.5.6测试了这种方法。
首先,您需要创建一个迁移文件:
1.在Visual Studio中,确保将定义DbContext的项目设置为启动项目
1.在Visual Studio中打开PMC:查看-〉其他窗口-〉程序包管理器控制台
1.在PMC中,将缺省项目设置为包含DbContext的项目
1.如果同时安装了EF core和EF 6.x:
EntityFramework\Add-Migration RunSqlScript
1.如果您只安装了EF 6.x:
Add-Migration RunSqlScript
在迁移文件夹中添加一个Sql脚本(我用与迁移文件相同的前缀命名它)

在文件属性窗口中,确保生成操作是“嵌入式资源”。注意,我们不需要复制到输出文件夹,因为SQL脚本将嵌入到程序集中。
更新RunSqlScript迁移中的Up方法

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

希望这能帮上忙

l7wslrjt

l7wslrjt3#

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

h7appiyu

h7appiyu4#

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

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

vuv7lop35#

1.可以使用包管理器控制台添加新迁移,如下所示:

add-migration add_defaultValues

1.然后在up方法中添加以下命令,其中包含要执行的命令:

protected override void Up(MigrationBuilder migrationBuilder)
{

    string Sql = @"GO
            INSERT [dbo].[TableName] ([Layer], [Environment], [Group], [Section], [Value], [Description], [LastChangeDate], [LoadType]) VALUES (N'ADMIN', N'TEST', N'PERFORMANCE', N'ALLOW_DB', N'true', NULL, CAST(N'2022-07-18T00:00:00.0000000' AS DateTime2), N'STARTUP')
            GO
            INSERT [dbo].[TableName] ([Layer], [Environment], [Group], [Section], [Value], [Description], [LastChangeDate], [LoadType]) VALUES (N'ADMIN', N'TEST', N'PERFORMANCE', N'ALLOW_FILE', N'false', NULL, CAST(N'2022-07-18T00:00:00.0000000' AS DateTime2), N'STARTUP')
            GO
            INSERT [dbo].[TableName] ([Layer], [Environment], [Group], [Section], [Value], [Description], [LastChangeDate], [LoadType]) VALUES (N'ADMIN', N'TEST', N'PERFORMANCE', N'ALLOW_MAIL', N'false', NULL, CAST(N'2022-07-18T00:00:00.0000000' AS DateTime2), N'STARTUP')
            GO";

    migrationBuilder.Sql(Sql);

}
bprjcwpo

bprjcwpo6#

有点晚了,但可能会有帮助。
您可以创建一个静态helper类,如下所示:

public static class SqlFileTrigger {    
  public static string GetRawSql(string fileName) {
    var baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Migrations"); // your default migrations folder
    var filePath = Path.Combine(baseDir, fileName);
    return File.ReadAllText(filePath);
  }
}

然后,使用类似的命名约定创建SQL文件,后跟“{migrationName}_Up.sql”和“{migrationName}_Down.sql”,例如:
例如,假设您创建的迁移命名为“20230120230041_AddAuditingProperties.cs
这样它们将被正确地分组到您的迁移.cs文件下。(您也可以为此创建一个单独的文件夹,但我通常更喜欢将它们堆叠起来,以便在需要时轻松检查)
然后,您可以添加“20230120230041_AddAuditingProperties_Up.sql“以及“20230120230041_AddAuditingProperties_Down.sql“(如果需要down sql)

那么对于.NET EF:

public partial class AddAuditingProperties : Migration
        {            
            protected override void Up(MigrationBuilder migrationBuilder)
            {
                Sql(Utils.SqlFileTrigger.GetRawSql("20230120230041_AddAuditingProperties_Up.sql"));
            }
    
            
            protected override void Down(MigrationBuilder migrationBuilder)
            {
                Sql(
                    Utils.SqlFileTrigger.GetRawSql("20230120230041_AddAuditingProperties_Down.sql"));
            }
        }

适用于.NET核心EF核心

public partial class AddAuditingProperties : Migration
    {            
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql(Utils.SqlFileTrigger.GetRawSql("20230120230041_AddAuditingProperties_Up.sql"));
        }

        
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql(
                Utils.SqlFileTrigger.GetRawSql("20230120230041_AddAuditingProperties_Down.sql"));
        }
    }

PS:作为一个侧记,如果你计划他们部署和运行在服务器上自动,请确保您右键单击那些创建的.sql文件,并设置“Build Action“为“Content“和“Copy to Output Directory“为“Copy always“-我有问题之前,当他们没有设置。

相关问题