我正在建立一个开发,qa,分期,生产系统的部署。我希望能够促进从一个环境发布到下一个环境,而不必从VS重新发布,也不需要手动触摸任何文件。
我需要为DEV、QA和STG/PRO建立单独的数据库,因此这意味着需要根据环境动态地切换连接字符串。
我可以在数据层中这样做--也许类似于这样:管理ASP.NET开发、分期和生产连接字符串(无需拔出头发) --但是我的数据层是建立在实体框架之上的。
问题:是否有一种方法可以在使用实体框架时实现连接字符串的动态切换?
发布于 2011-11-23 03:17:53
我正在建立一个开发,qa,分期,生产系统的部署。我希望能够促进从一个环境发布到下一个环境,而不必从VS重新发布,也不需要手动触摸任何文件。
这是非常奇怪和糟糕的要求。在部署到不同环境期间重新配置应用程序是绝对常见的。与其在应用程序中硬编码这一点,不如在应用程序中使用不同的安装/部署脚本集,这些脚本在从一个环境迁移到另一个环境时也会更改您的配置文件。
保存配置中所有环境的配置是IMHO非常糟糕的做法。
即使是硬编码的解决方案,您仍然需要更改一些“配置”来告诉应用程序它当前运行的环境。硬编码解决方案将使用有关环境的信息从配置文件中选择正确的连接字符串并将其传递给上下文构造函数。
作为上述方法的示例,您可以尝试这样做。每次重新部署应用程序时,仍然需要更改环境变量--自定义部署脚本中这种修改的复杂性与替换连接字符串完全相同:
配置文件:
<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)
{ }
}
发布于 2011-11-23 02:32:43
假设您使用的是工作单元模式;这意味着您的对象上下文是在每个工作单元之后重新创建的。您可能有一个类,它继承自某种类型的对象上下文,因此在用于创建该上下文的构造函数中,您可以引用允许传入连接字符串的基本构造函数。在那里,您可以调用静态方法或新建一个对象来处理连接字符串的创建或传递实体连接。
如果您使用的是DbContext
,它是相同的,只对DbConnection
而不是EntityConnection
。
https://stackoverflow.com/questions/8239788
复制相似问题