【问题标题】:How to move asp.net entity framework connectionStrings to within appSettings section of web.config如何将 asp.net 实体框架 connectionStrings 移动到 web.config 的 appSettings 部分
【发布时间】: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 吗?
  • 是的,但从未参与过。所以不知道你的连接字符串会怎么选。

标签: entity-framework asp.net-web-api deployment web-config amazon-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);
            }
        }
    }

重要:

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

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

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

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

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

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

【讨论】:

  • 您有没有找到更好的解决方案来转换弹性豆茎中的连接字符串?
  • 在 Elastic Beanstalk 中,web.config 中的 appSettings 成为 AWS EC2 中的环境变量。将其正式化的最佳方法是将它们包含在 Cloudformation 脚本中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2011-08-26
  • 1970-01-01
  • 2010-10-29
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多