entity-framework - 如何将 ASP.NET Entity Framework ConnectionStrings 移至 web.config 的 appSettings 部分

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

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

WebAPI 项目依赖于 Entity Framework ,并在 <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>

我的目标是通过 <appSettings> 下的条目解析 Entity Framework “myDBEntities”connectionString 名称。 web.config 部分,如下所示:

  <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<的末尾/strong> appSetting 值试图让它工作/解决。但运气不佳。

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

有什么想法/建议吗?

最佳答案

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

首先使用您希望替换的连接字符串的名称创建一个appSetting,在本例中为“myDBEntities”。对于其,使用相同的元数据连接字符串,结果为:

<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. 创建“ConnectionStringSettings”时,名称需要与您要替换的 Entity Framework 连接字符串的名称相匹配(即“myDBEntities”)。

  2. 请务必指定正确的提供程序名称(即“System.Data.EntityClient”),这可以从您的原始连接字符串设置中获取。

  3. 请务必注释掉或删除原始的连接字符串设置。

Entity Framework 现在能够将 appSetting“myDBEntities” 解析为 Entity Framework 连接。

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

希望这可以帮助其他人将他们的 .NET 应用程序引入 AWS Elastic Beanstalk 云。

关于entity-framework - 如何将 ASP.NET Entity Framework ConnectionStrings 移至 web.config 的 appSettings 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686486/

相关文章:

c# - 如何查看DbContext是否有事务?

c# - 同一解决方案中的 MVC 和 Web Api 项目

asp.net-web-api - 在 WebAPI 中的查询字符串中传递并验证 OWIN Bearer token

database - Visual Studio 2010 : Is there a way to deploy a single database object that retains the object in normal builds?

ruby-on-rails - Linux 上新 Rails 部署的最佳实践?

ubuntu - Capistrano 在从本地机器部署到服务器时要求输入 SSH 密码

c# - 转换并合并两个相同接口(interface)但不同类型的列表

c# - 在 Entity Framework 拦截器中向 DbScanExpression 添加内部连接

c# - 将谓词作为参数传递给 Where 子句时 EF SQL 发生了变化

asp.net - 我可以使用 MiniProfiler 检测 ASP.NET MVC WebApi 网站吗?