如何保持"提供商连接字符串"与EF(EDMX)元数据信息分开?

时间:2015-02-18 22:19:06

标签: c# entity-framework connection-string edmx

我希望能够在配置(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与部署的目标程序集中的用法处于一个单独的项目中。

2 个答案:

答案 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" />