如何将 asp.net 实体框架 connectionStrings 移动到 web.config 的 appSettings 部分

Posted

技术标签:

【中文标题】如何将 asp.net 实体框架 connectionStrings 移动到 web.config 的 appSettings 部分【英文标题】:How to move asp.net entity framework connectionStrings to within appSettings section of web.config 【发布时间】:2015-12-17 15:18:06 【问题描述】:

我正在将 ASP.NET WebAPI 项目部署到 AWS 中的 Elastic Beanstalk

WebAPI 项目依赖于实体框架,并且在<connectionStrings> 下的web.config 中定义了一个连接字符串属性,如下所示:

<connectionStrings>
   <add name="myDBEntities" connectionString="metadata=res://*/myDBModel.csdl|res://*/myDBModel.ssdl|res://*/myDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

我的目标是通过 web.config 的 &lt;appSettings&gt; 部分下的条目解析实体框架“myDBEntities”connectionString 名称,如下所示:

  <appSettings>
    <add key="myDBEntities" value="metadata=res://*/myDBModel.csdl|res://*/myDBModel.ssdl|res://*/myDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==; multipleactiveresultsets=True;App=EntityFramework&quot; providerName=System.Data.EntityClient;" />
  </appSettings>

注意:我巧妙地将 "providerName=System.Data.EntityClient;" 添加到 myDBEntities appSetting 值试图让它工作/解决。但没有运气。

删除 connectionString 设置并移至 appSettings 下,以便将其配置为 Elastic Beanstalk 中的环境配置设置。

有什么想法/建议吗?

【问题讨论】:

你能具体说明这样做的目的是什么!!可能有更简单的解决方案! 当 .NET 尝试解析名为“myDBEntities”的连接字符串时,我希望它能够使用“appSetting”键/值对来解析。 你已经提到的问题,那是什么目的! 删除 connectionString 设置并移至 appSettings 下,以便将其配置为 Elastic Beanstalk 中的环境配置设置。您知道 AWS Elastic Beanstalk 吗? 是的,但从未参与过。所以不知道你的连接字符串会怎么选。 【参考方案1】:

找到了一个可行的解决方案,这个解决方案提出的是在应用程序启动时动态创建连接字符串。

首先创建一个 appSetting,并使用 key 您希望在这种情况下替换的连接字符串的名称 "myDBEntities"。对于它的 value 使用相同的元数据连接字符串,结果是:

<appSettings>
    <add key="myDBEntities" value="metadata=res://*/myDBModel.csdl|res://*/myDBModel.ssdl|res://*/myDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework&quot;" />
</appSettings>

注意:暂时不要担心 appSetting 字符串中的 provider name,这将在下一节中解决)

将以下代码添加到您的 global.asax 文件中:

    protected void Application_Start()
    
        // ... other stuff in here if not already empty.

        var fieldInfo = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        if (fieldInfo != null)
        
            fieldInfo.SetValue(ConfigurationManager.ConnectionStrings, false);

            // Check for AppSetting and Create
            if (ConfigurationManager.AppSettings["myDBEntities"] != null)
            
                ConnectionStringSettings myDB = new ConnectionStringSettings("myDBEntities", ConfigurationManager.AppSettings["myDBEntities"]);
                myDB.ProviderName = "System.Data.EntityClient";
                ConfigurationManager.ConnectionStrings.Add(myDB);
            
        
    

重要:

    创建“ConnectionStringSettings”时,名称需要与您要替换的实体框架 connectionString 的名称相匹配(即“myDBEntities”)。

    确保指定正确的提供者名称(即“System.Data.EntityClient”)这可以从您原来的 connectionString 设置中获取。

    请务必注释掉或删除您原来的 connectionString 设置。

实体框架现在能够将 appSetting "myDBEntities" 解析为实体框架连接。

以下文章有助于解决此问题 Can I Add ConnectionStrings to the ConnectionStringCollection at Runtime?

希望这有助于其他人将他们的 .NET 应用程序纳入 AWS Elastic Beanstalk 云。

【讨论】:

您有没有找到更好的解决方案来转换弹性豆茎中的连接字符串? 在 Elastic Beanstalk 中,web.config 中的 appSettings 成为 AWS EC2 中的环境变量。将其正式化的最佳方法是将它们包含在 Cloudformation 脚本中。

以上是关于如何将 asp.net 实体框架 connectionStrings 移动到 web.config 的 appSettings 部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

Asp.net 如何使用实体框架删除一对多的对象

ASP.NET 5 ,想要将实体框架从 Web 项目中分离出来

asp.net mvc实体框架代码先将外键与不同名称关联

如何在没有实体框架的情况下使用 ASP.NET Identity 3.0 [关闭]

如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?