为什么Entity Framework连接需要元数据属性?

35

我将我的数据访问层从使用LINQ切换到了Entity Framework。由于我的应用程序要根据当前用户连接到不同的数据库,因此我需要在运行时动态创建DataContext并传入适当的连接字符串。然而,当我尝试使用旧的连接字符串编程方式创建一个Entity Framework连接时,连接失败了。它抱怨说它无法识别连接字符串中的关键字,具体来说是"server"。

我发现为了让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());
为什么会这样呢?元数据属性是什么用途?它始终对于多个不同的连接而言都是相同的,这会成为问题吗?应该是什么呢?有没有什么方法可以解决这个问题?
提前感谢您!
更新1: 谢谢您的更新,Randolpho,但是…… 我遇到这个问题的整个原因在于,我无法将连接字符串存储在配置文件中。连接字符串是由连接的用户在运行时动态确定的。
以下是我的确切情况: 如果用户A正在连接,则应用程序从数据库A中提取数据。如果用户B正在连接,则应用程序从数据库B中提取数据。 连接字符串存储在主数据库中,数量可能是无限的。每次添加用户时,我都不想进入web.config,更别说这会变得非常大!

由于每个连接的映射都相同且不会更改,因此我是否可以在所有连接中使用相同的元数据并不重要,对吗? - John B
是的,那是正确的。 - user230910
2个回答

29

在Randolpho的回答基础上扩展:

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


CSDL, MSL, SSDL 是 EF6 规范中关于关联和别名的部分。 - mins

11

2
@ocdecio:不要因为这个原因就否定EF;NHibernate的工作方式基本相同。虽然我相信还有其他原因。 :) - Randolpho
2
@ocdecio,我很想看到一种不使用某种映射文件的ORM映射器。除非您正在执行1:1与表格,否则必须有某些东西告诉某些东西该做什么。 - John Farrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接