2011-11-23 49 views
1

我正在设置一个dev,qa,staging,生产系统的部署。我希望能够促进从一个环境发布到下一个环境,而无需从VS重新发布,也无需手动触摸任何文件。基于环境确定连接字符串,同时使用实体框架

我需要单独的DEV,QA和STG/PRO数据库,所以这意味着连接字符串需要根据环境动态切换。

我可以在数据层做到这一点 - 可能类似于这样的:Managing ASP.NET Development, Staging and Production Connection Strings (without pulling your hair out) - 但我的数据层是建立在实体框架之上的。

问题:有没有办法在使用实体框架时实现连接字符串的动态切换?

+0

[基于环境使用EF 4.1/DbContext切换连接字符串]的可能重复(http://stackoverflow.com/questions/7434753/switch-connection-strings-based-on-environment-with-ef-4-1- dbcontext) – Faust

回答

1

我正在设置一个dev,qa,stage,production system of deployment。 I 希望能够将下一版本从一个环境发布到 ,而无需从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) 
    { } 
} 
+0

这可能是一个有效的评论,但它不是我的问题的答案。请转到评论。 “回答”与非答案阻止他人回答。 – Faust

+0

最后一段回答你的问题。其余的只是解释你为什么做错了。这就是你首先问这个问题的原因,不是吗?要学会如何正确地做... –

+0

另外如果“提供的托管要求在分段和生产中使用相同的代码库,包括连接字符串”(如在本文中:http://stackoverflow.com/questions/7434753/switch-connection-strings-based-on-environment-with-ef-4-1-dbcontext) – Faust

0

假设您正在使用工作单元模式;这意味着您的对象上下文会在每个工作单元完成后重新创建。 您可能有一个类,它继承自某种对象上下文,因此在用于创建该上下文的构造函数中,您可以引用允许传递连接字符串的基础构造函数。 从那里,你可以调用一个静态方法或新建一个对象来处理创建连接字符串或传递实体连接。

如果您使用的是DbContext,它是一样的,只有DbConnection而不是EntityConnection