我正在设置dev,qa,staging,部署生产系统。我希望无需从VS重新发布,也无需手动触摸任何文件,即可从一个环境升级到下一个环境。
我需要DEV,QA和STG / PRO的单独数据库,因此这意味着需要根据环境动态切换连接字符串。
我可以在数据层中执行此操作 - 可能与此类似:Managing ASP.NET Development, Staging and Production Connection Strings (without pulling your hair out) - 但我的数据层是基于实体框架构建的。
问题:在使用Entity Framework时,有没有办法实现连接字符串的动态切换?
答案 0 :(得分:1)
我正在设置dev,qa,staging,部署生产系统。一世 希望能够促进从一个环境发布到 接下来无需从VS重新发布,也无需手动重新发布 触摸任何文件。
这是非常奇怪和不好的要求。在部署到不同环境期间重新配置应用程序是绝对常见的。您应该使用不同的安装/部署脚本集,而不是在应用程序中对其进行硬编码,这些脚本也会在从一个环境移动到另一个环境时更改配置文件。
保持配置中所有环境的配置是恕我直言,非常糟糕的做法。
即使使用硬编码解决方案,您仍需要更改一些“配置”以告知应用程序当前运行的环境。硬编码解决方案将使用有关环境的信息从配置文件中选择正确的连接字符串,并将其传递给上下文构造函数。
作为上述方法的示例,您可以尝试这一点。每次重新部署应用程序时,仍然需要更改环境变量 - 自定义部署脚本中此类修改的复杂性与替换连接字符串完全相同:
配置文件:
<appSettings>
<add key="environment" value="Dev"/>
</appSettings>
<connectionStrings>
<add name="Dev" connectionString="..."/>
</connectionStrings>
上下文工厂方法代码:
public static YourContext ContextFactory()
{
string environment = WebConfigurationManager.AppSettings["environment"].Value;
// This should be correctly recognized as a name of connection string.
return new YourContext(environment);
}
上下文:
public class YourContext : DbContext
{
public YourContext(string connectionStringName) : base(connectionStringName)
{ }
}
答案 1 :(得分:0)
假设您使用的是工作单元模式;这意味着在每个工作单元之后重新创建对象上下文。 您可能有一个继承自某种对象上下文的类,因此在用于创建该上下文的构造函数中,您可以引用允许传入连接字符串的基本构造函数。 从那里,您可以调用静态方法或新建对象来处理连接字符串的创建或传入实体连接。
如果您使用的是DbContext
,则只能使用DbConnection
代替EntityConnection
。