如何通过反射创建连接字符串(edmx,实体框架)

时间:2013-09-27 22:01:09

标签: c# entity-framework reflection edmx

问题如下;我们的代码可以与许多具有相同或相似模型的数据库进行通信。

代码的结构化方式是每个业务项目都只有一个数据上下文,它关注的是表(它有超过一千个)。这意味着我们最终需要根据服务器信息生成连接字符串。

问题变成了元数据= res:// /DataModel.XXXX.csdl|res:// /DataModel.XXXX.ssdl|res://*/DataModel.XXXX.msl部分;因为这个名字没有标准化。

有没有办法使用System.Data.Objects.ObjectContex结合反射来解决XXXX。

我们使用的代码要求我们解决如下问题。

var scsb = new SqlConnectionStringBuilder();
scsb.DataSource = (string.IsNullOrWhiteSpace(DatabaseServerUri) ? Uri : DatabaseServerUri) + (string.IsNullOrEmpty(SqlInstanceName) ? string.Empty : string.Format(@"\\{0}", SqlInstanceName));
scsb.InitialCatalog = MainDatabase; 
scsb.IntegratedSecurity = false;
scsb.Password = "stuff";
scsb.UserID = "morestuff";
scsb.ConnectTimeout = 3600;

var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/DataModel.XXXX.csdl|res://*/DataModel.XXXX.ssdl|res://*/DataModel.XXXX.msl"; 
builder.Provider = "System.Data.SqlClient"; 
builder.ProviderConnectionString = scsb.ConnectionString;

return builder.ConnectionString;

1 个答案:

答案 0 :(得分:0)

将我的评论扩展到答案

模型和映射文件通常嵌入在程序集中(ObjectContext所在的位置),因此您可以提供该程序集名称以从程序集的嵌入资源中读取它们。为此,您可以执行以下操作:

builder.Metadata = string.Format("res://{0}", typeof(MyObjectContext).Assembly.FullName);