我希望能够在配置(app.config,web.config)中单独处理实际连接字符串和EF元数据连接字符串 - 目标是使 >实际的数据源更明显。
我可以完全控制创建EF上下文(yay IoC!),但不想对任何值进行硬编码。最好是:
<add name="EfEntities"
connectionString="metadata=res://*/..;provider connection string=NO;.." />
<add name="EfEntities_Provider"
connectionString="data source=SERVER;initial catalog=DB;user id=ME" />
部署的配置只有集合的EF连接字符串 - 只要它是从源配置中的单独属性构建的,这也是可以接受的,也可能更好。 (但是这种配置转换水平让我感到厌烦。)
我很适合使用Designer / Updater的集合EF“连接字符串” - EDMX与部署的目标程序集中的用法处于一个单独的项目中。
答案 0 :(得分:2)
在我的项目中,我自己在代码中构建EF连接字符串并将其传递给Context对象的构造函数,如下所示:
void InitContext() {
String actualConnectionString = ConfigurationManager.ConnectionStrings["server123"].ConnectionString;
String efConnectionString = String.Format(CultureInfo.InvariantCulture, "metadata=res://*/..;provider connection string={0};.", actualConnectionString);
_context = new MyEFContext( efConnectionString );
}
答案 1 :(得分:1)
我决定&#34;去&#34;戴的回答背后有这个想法。可能存在问题(例如,密码最好不包含引用);但它在测试中起作用,感觉更多&#34;可见&#34;在配置转换。
代码看起来像:
var edmxMetadata = GetConnectionStringSetting("EfEntities_Metadata");
var providerConnection = GetConnectionStringSetting("EfEntities_Provider");
var edmxCS = string.Format(@"{0};provider={1};provider connection string=""{2}""",
edmxMetadata.ConnectionString,
providerConnection.ProviderName,
providerConnection.ConnectionString);
// (and by and by)
var context = new EfEntities(edmxCS);
其中:
<!-- just the metadata -->
<add name="EfEntities_Metadata"
connectionString="metadata=res://*/EfEntities.csdl|res://*/EfEntities.ssdl|res://*/EfEntities.msl"
providerName="System.Data.EntityClient" />
<!-- just the provider connection string -->
<add name="EfEntities_Provider"
connectionString="data source=SERVER;initial catalog=DB;user id=ME"
providerName="System.Data.SqlClient" />