在 DbMigration 中访问 Up 里面的数据库名

ced*_*lof 5 .net sql sql-server entity-framework ef-code-first

我在代码优先迁移中有以下代码:

public partial class RunSQLInit : DbMigration
{
    public override void Up()
    {
        this.Sql(SqlFiles.Create_Job_ClearExpiredData);
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

哪里SqlFiles.Create_Job_ClearExpiredData是一个以字符串形式返回 SQL 文件的 resx 文件。SQL 在 SQL Server 中创建和调度服务器代理作业。

现在,SQL 有两个“变量”,我需要在对数据库运行迁移之前进行更改:作业应该运行的数据库的名称,以及实际作业的名称。如果我只有一个环境,那会很好,但是我将这个代码优先项目部署到多个环境中,这些环境在数据库名称和我应该称之为 Job 的内容上有所不同。

我看到了三种可能性:

  1. 获取当前在 Up() 方法中使用的连接字符串,并使用它来解析数据库名称并在运行之前将其替换为 SQL 字符串。但是我将如何获取“当前正在使用的连接字符串”?
  2. Update-Database在包管理器控制台中运行时,以某种方式将变量传递给迁移,该变量可以在迁移内部访问。我该怎么做?
  3. 使用另一种解决方案来创建作业。我们在很大程度上依赖于从代码优先模型部署到所有环境的便利性,因此在更新数据库和生成部署脚本(使用Update-Database -script

有问题的 SQL 脚本的一小部分是这样的:

EXEC msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run SP', 
    @step_id=1,
    @subsystem=N'TSQL',
    @command=N'exec sp_ClearExpiredData;', 
    @database_name=@databaseName, --This is where I need the varying database name!
    @flags=0
Run Code Online (Sandbox Code Playgroud)

ced*_*lof 6

我的问题的答案是简单地在 SQL 文件中使用它:

set @databaseName = db_name()
Run Code Online (Sandbox Code Playgroud)

由于当前上下文已经是我将用于该作业的数据库,因此它已经存在。太容易了。