为什么实体框架连接需要元数据属性?

Joh*_*ski 32 database connection entity-framework connection-string data-access-layer

我将DAL从使用LINQ切换到Entity Framework.因为我的应用程序根据当前用户连接到不同的数据库,所以我需要在运行时动态创建DataContext并传入适当的连接字符串.但是,当我尝试使用旧连接字符串以编程方式创建实体框架连接时,连接失败.它抱怨它没有识别连接字符串中的密钥,确切地说是"服务器".

我发现我需要这样做才能使Entity Framework连接正常工作:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = clientConnectionString;
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl...";
Entities entities = new Entities(entityBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)

为什么是这样?
什么是元数据属性?
对于多个不同的连接,它总是一样的问题吗?
它应该是什么?
有没有办法解决?

提前致谢!

更新1:感谢更新Randolpho,但是......
我遇到此问题的全部原因是我无法将连接字符串存储在配置文件中.连接字符串在运行时由用户连接动态确定.

这是我的确切场景:
如果用户A正在连接,则应用程序从数据库A中提取数据.如果用户B正在连接,则应用程序从数据库B中提取数据.
连接字符串存储在主数据库中,并且该数字可能是无限的.每次添加用户时,我都不想进入web.config,更不用说它最终会变得巨大!

Dav*_*sky 27

扩展Randolpho的答案:

元数据属性专门指向.SSDL(存储模型),.CSDL(概念模型)和.MSL(映射模型)文件的位置.这三个文件基本上是实体数据模型."res://"URI样式限定符表示文件作为资源嵌入到已编译的EDM程序集中.


Ran*_*pho 10

您会发现这些链接非常有用:

http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring.aspx

http://weblogs.asp.net/pgielens/archive/2006/08/21/ADO.NET-Entity-Framework-Metadata.aspx

底线?实体框架需要元数据来构建实体映射.

此外,您应该考虑将连接信息移到配置文件中,而不是在代码中构建它.第一个链接将告诉您如何做到这一点.

  • @ocdecio:不要仅为此折扣EF; NHibernate的工作方式几乎相同.不过,我确信还有其他原因.:) (2认同)
  • @ocdecio,我很想看到一个不使用某种映射文件的ORM映射器.除非你用表1:1做一些东西必须告诉什么todo. (2认同)