如何将 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
我的目标是通过 web.config 的 <appSettings>
部分下的条目解析实体框架“myDBEntities”connectionString 名称,如下所示:
<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 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework"" />
</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 5 ,想要将实体框架从 Web 项目中分离出来