我有3个数据库DBDev,DBStaging和DBProduction。在我的应用程序内部,我为每个数据库创建了3个edmx。每个DB都有一个匹配的实体,如下所示:DBDev - > DEVEntities,DBStaging - > StagingEntities或DBProduction - > ProductionEntities
我在web.config中选择我想要访问的数据库:
<connectionStrings configSource="Configs\DBDev.config" /> <!-- or DBStaging or DBProduction-->
我将我的所有数据库访问路由到一个静态类:DBAccess。当我需要指向特定的上下文时,我手动执行此操作:
private static DEVEntities db = new DEVEntities();
或
private static StagingEntities db = new StagingEntities();
或
private static ProductionEntities db = new ProductionEntities();
什么是更智能的方式来指向所需的上下文而无需手动更改它?
答案 0 :(得分:5)
在配置文件中创建三个不同的连接字符串,如下所示:
<connectionStrings>
<add name="DevConnection" connectionString="..." />
<add name="StagingConnection" connectionString="..." />
<add name="ProdConnection" connectionString="..." />
</connectionStrings>
在您的Entity Framework上下文类中,添加一个构造函数,该构造函数将连接字符串作为参数并调用相应的基础构造函数:
public class MyEntities : ObjectContext // or DbContext
{
public MyEntities(string connectionString) : base(connectionString) {}
}
通过传递连接字符串的名称来实例化您的实体上下文。您还可以使用依赖项注入容器并将其配置为使用正确的值:
var context = new MyEntities("DevConnection");
答案 1 :(得分:1)
另一个符合ALM条件的解决方案:
创建设置
&LT;&的ConnectionStrings GT; &lt; add name =&#34; dbConnection&#34;的connectionString =&#34; ...&#34; ... /&gt; &LT; /&的ConnectionStrings GT;
在Solution Explorer中展开Web.config,您将看到Web.Debug.config和Web.Release.config
添加到
&LT;&的ConnectionStrings GT; &lt; add name =&#34; dbConnection&#34;的connectionString =&#34; ...&#34; ... XDT:变换=&#34; SetAttributes&#34; XDT:定位=&#34;匹配(名称)&#34; /&GT; &LT; /&的ConnectionStrings GT;
您可以添加其他Web.xxx.configs。我已经尝试并测试了这个Azure Cloud Service项目,其中包含多个用于本地调试,暂存调试,生产等的配置,并且它工作正常。如果您要创建Azure Web应用程序,这是推出新版本的推荐方法,因为当您交换Staging / Production代码时,它将交换代码而不是您的配置。
当然你可以在没有Azure的情况下使用它:)这也是推荐的方式,以免在配置林中丢失。
另一个好处是,您可以右键单击Web.xxx.config,然后单击“预览转换”&#39;这不仅可以为您提供预览,还可以验证您的配置。