我正在使用C#,Visual Studio 2010和Entity Framework 4.我有一个包含多个实体模型的程序集。项目要求是我没有在app.config中存储任何连接信息。
我编写了一个方法,当我提供要加载的模型的名称时返回实体连接字符串。
public static string GetEntityConnectionString(string modelName)
{
const string providerName = "somedatabaseprovider";
string metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", modelName);
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder
{
Provider = providerName,
ProviderConnectionString = GetProviderConnectionString(),
Metadata = metadata
};
return entityBuilder.ToString();
}
我现在想通过传递实体模型类型而不是模型名称的文字字符串来使其更具防弹性。当我在Visual Studio中编辑实体模型时,MyModel的属性窗口(类型为ConceptualEntityModel)包含一个名为“Entity Container Name”的属性,显示MyEntities,另一个属性名为“Namespace”,显示MyModel。
在设计时,我可以访问的类型是MyEntities。如何在运行时派生存储在ConceptualEntityModel的“Namespace”属性中的值?
答案 0 :(得分:2)
这已经晚了几个月,但我把这个想法提出来讨论。 我从模型中的任何一个实体(表)获得了Conceptual Entity Model命名空间属性,如下所示:
string namespaceName = EDMInstance.Entity.EntitySet.ElementType.NamespaceName;
所以我有一个名为“NITESMOVE_EDM”的实体数据模型,其中包含一个实体“NM_PATHS”,并按如下方式创建实体元数据位置字符串:
// create an instance of the Data Model
NITESMOVE_EDM EDMinst = new NITESMOVE_EDM();
// create a connection string builder
System.Data.EntityClient.EntityConnectionStringBuilder entityBuilder = new System.Data.EntityClient.EntityConnectionStringBuilder();
// Set the Metadata location, by querying an Entity in the model
entityBuilder.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", EDMinst.NM_PATHS.EntitySet.ElementType.NamespaceName);
这可以与此处给出的建议结合使用:MSDN How to: Build an EntityConnection Connection String
答案 1 :(得分:0)
好吧,如果你的目标是使这个“防弹”,这将无法奏效。您调用modelName
的字符串实际上不是模型名称,而是资源名称。在您的情况下,它恰好与模型名称相同,但that isn't always true。