2013-11-21 18 views
2

我有一个代码,第一次迁移以下代码:内访问该数据库名DbMigration

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

    [...] 
} 

其中SqlFiles.Create_Job_ClearExpiredData是RESX文件返回一个SQL文件作为一个字符串。 SQL在SQL Server中创建和调度服务器代理作业。

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

我看到三种可能性:

目前正在向上()内使用的连接字符串的
  1. 弄个 - 方法,并用它来解析出数据库的名称和做它替换到SQL运行它之前的字符串。但我将如何去获取“正在使用的连接字符串”?
  2. 在程序包管理器控制台中运行Update-Database时,可能会在迁移内部访问某种方式将变量传递给迁移。我会怎么做呢?
  3. 使用另一种解决方案来创建作业。我们在很大程度上依赖于容易地从代码优先模型的所有环境中部署的,所以应该以某种方式很容易实现自动化,无需额外劳动更新数据库时,以及生产部署脚本(与Update-Database -script

一小截出从这个SQL脚本是这样的:

EXEC msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Run SP', 
    @step_id=1, 
    @subsystem=N'TSQL', 
    @command=N'exec sp_ClearExpiredData;', 
    @[email protected], --This is where I need the varying database name! 
    @flags=0 

回答

2

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

set @databaseName = db_name() 

由于当前的环境已经是我将用于工作的数据库,它已经在那里了。太容易了。

1

选项1是适合您的数据库名称。请参阅Is there any connection string parser in C#?

作业可能需要来自配置文件。放入AppSettings的名字,那么你可以做

string jobName = ConfigurationManager.AppSettings["jobName"]

你可以做DBNAME同样也当然是:

string dbName = ConfigurationManager.AppSettings["dbName"]

我有一个配置类,看起来像这样:

public class Config 
{ 
    public static string ConnectionStringName 
    { 
     get { return GetValue("ConnectionStringName", "SID_2013Context"); } 
    }  

    private static string GetValue(string key, string defaultValue) 
    { 
     return ConfigurationManager.AppSettings[key] ?? defaultValue; 
    } 
} 

我的DBContext类构造函数如下所示:

public SID2013Context() 
     : base("Name=" + Config.ConnectionStringName) 
    { 
    } 

我的网页。配置有一个连接字符串:在我的向上()迁移

public static string ConnectionString 
{ 
    get { return ConfigurationManager.ConnectionStrings[ConnectionStringName] 
            .ConnectionString; } 
} 

public static string DatabaseName 
{ 
    get 
    { 
     var builder = new System.Data.SqlClient 
         .SqlConnectionStringBuilder(ConnectionString); 
     return builder.DataSource; 
    } 
} 

然后:

<connectionStrings> 
    <add name="SID_2013Context" connectionString="etc" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

所以,我可以几个属性添加到我的配置类

public override void Up() 
    { 
     string databaseName = Config.DatabaseName; 
    } 
+0

问题是我需要更改名称,具体取决于我部署到的数据库。 AppSetting会为整个应用程序设置名称,而不管我将其部署到什么位置。 – cederlof

+0

选项1不起作用,因为我无法访问Up方法中的“当前运行”连接字符串。这是我的问题。 – cederlof

+0

+1连接字符串解析器 – cederlof