我正在将 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework"" 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==; multipleactiveresultsets=True;App=EntityFramework" 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework"" />
</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);
}
}
}
重要:
创建“ConnectionStringSettings”时,名称需要与您要替换的 Entity Framework 连接字符串的名称相匹配(即“myDBEntities”)。
请务必指定正确的提供程序名称(即“System.Data.EntityClient”),这可以从您的原始连接字符串设置中获取。
请务必注释掉或删除原始的连接字符串设置。
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/