如何将 "Provider Connection String" 与 EF (EDMX) 元数据信息分开?
How to keep the "Provider Connection String" separate from the EF (EDMX) metadata information?
我希望能够在配置中分别处理 实际 连接字符串和 EF 元数据连接字符串(app.config、web.config) - 目标是使 实际 数据源更加明显。
我可以完全控制创建 EF 上下文(是的 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 "connection string" 感到满意 - EDMX 与部署的目标程序集中的使用在一个单独的项目中。
在我的项目中,我自己在代码中构建 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 );
}
我决定 "go" 戴的回答背后的想法。它可能有问题(例如,密码最好不要包含引号);但它在测试中有效,在配置转换中感觉更 "visible"。
代码大致如下:
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" />
我希望能够在配置中分别处理 实际 连接字符串和 EF 元数据连接字符串(app.config、web.config) - 目标是使 实际 数据源更加明显。
我可以完全控制创建 EF 上下文(是的 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 "connection string" 感到满意 - EDMX 与部署的目标程序集中的使用在一个单独的项目中。
在我的项目中,我自己在代码中构建 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 );
}
我决定 "go" 戴的回答背后的想法。它可能有问题(例如,密码最好不要包含引号);但它在测试中有效,在配置转换中感觉更 "visible"。
代码大致如下:
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" />