我正在将 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="data source=myServer\test;initial catalog=myDB;user id=myDBUser;password=PASS==;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
部分下的条目解析,如下所示:
<appSettings>
注意: 我已经将&#34; providerName = System.Data.EntityClient;&#34; 添加到了最后 myDBEntities appSetting值,试图让它工作/解决。但没有运气。
删除 connectionString 设置并移至 appSettings 下,以便可以将其配置为Elastic Beanstalk中的环境配置设置。
有任何想法/建议吗?
答案 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="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);
}
}
}
重要提示:
创建&#34; ConnectionStringSettings&#34;该名称需要与您要替换的实体框架connectionString匹配(即。&#34; myDBEntities&#34;)。
请务必指定正确的提供商名称(即&#34; System.Data.EntityClient&#34;)这可以从原始的connectionString设置中获取。
请务必注释掉或删除原始的connectionString设置。
实体框架现在能够将appSetting &#34; myDBEntities&#34; 解析为实体框架连接。
以下文章有助于实现此解决方案 Can I Add ConnectionStrings to the ConnectionStringCollection at Runtime?
希望这有助于其他人将他们的.NET应用程序纳入AWS Elastic Beanstalk云。