1

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

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

问题变成了 metadata=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;
4

1 回答 1

0

将我的评论扩展到答案

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

builder.Metadata = string.Format("res://{0}", typeof(MyObjectContext).Assembly.FullName);
于 2013-10-07T16:43:46.950 回答