如何将 "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" />