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

时间:2015-09-21 02:27:41

标签: entity-framework asp.net-web-api deployment web-config elastic-beanstalk

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

WebAPI项目依赖于Entity Framework,并在services.AddScoped<MyRepository>(s => new MyRepository(context, tenantId)); 下的 web.config 中定义了一个连接字符串属性,如下所示:

<connectionStrings>

我的目标是拥有实体框架&#34; myDBEntities &#34; connectionString name通过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> 部分下的条目解析,如下所示:

<appSettings>

注意: 我已经将&#34; providerName = System.Data.EntityClient;&#34; 添加到了最后 myDBEntities appSetting值,试图让它工作/解决。但没有运气。

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

有任何想法/建议吗?

1 个答案:

答案 0 :(得分:2)

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

首先在&#34; myDBEntities&#34; 中创建一个appSetting,其中包含您要替换的连接字符串的名称。对于,请使用相同的元数据连接字符串,结果为:

<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字符串中的提供商名称,现在这将在下一节中讨论)

将以下代码添加到 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. 创建&#34; ConnectionStringSettings&#34;该名称需要与您要替换的实体框架connectionString匹配(即。&#34; myDBEntities&#34;)。

  2. 请务必指定正确的提供商名称(即&#34; System.Data.EntityClient&#34;)这可以从原始的connectionString设置中获取。

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

  4. 实体框架现在能够将appSetting &#34; myDBEntities&#34; 解析为实体框架连接。

    以下文章有助于实现此解决方案 Can I Add ConnectionStrings to the ConnectionStringCollection at Runtime?

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