在运行时更改实体框架数据库模式

use*_*545 10 c# asp.net entity-framework

在大多数asp.net应用程序中,您可以通过在运行时修改连接字符串来更改数据库存储.即我只需更改connectionstring中"database"字段的值,即可从使用测试数据库更改为生产数据库

我正在尝试使用实体框架更改架构(但不一定是数据库本身),但没有运气.

我看到的问题是edmx xml文件中的SSDL内容正在存储每个实体集的模式.

见下文

<EntitySet 
    Name="task" 
    EntityType="hardModel.Store.task" 
    store:Type="Tables" 
    Schema="test"  />
Run Code Online (Sandbox Code Playgroud)

现在我已将schema属性值从test更改为"prod",它可以工作..

但这似乎不是一个好的解决方案.

  1. 我需要更新外部实体集以及存储过程(我有+50个表)
  2. 我只能在编译时这样做吗?
  3. 如果我然后尝试稍后更新实体模型 - 由于EF没有识别该表已经存在于edm中而正在读取已存在的实体.

有什么想法吗?

小智 6

我有同样的问题,这真的很烦人,因为这是微软真的错过了船的情况之一.使用EF的一半原因是支持其他数据库,但除非您首先使用代码并不能真正解决问题.

在MS SQL中,更改模式毫无意义,因为模式是表的标识的一部分.对于其他类型的数据库,模式非常不是数据库标识的一部分,只能确定数据库的位置.连接到Oracle并更改数据库和更改架构本质上是同义词.

  • 我也在这里因为Oracle场景,到目前为止我已经导致手动编辑RAW .edmx文件以删除实体集节点的Schema部分,以及生成的sql语句......它可以工作,但是这是一种不得不做事的糟糕方式. (2认同)

Cra*_*ntz 2

更新阅读您的评论后,很明显您想要更改每个数据库的引用架构,而不是数据库。我编辑了问题以澄清这一点并恢复您提供的隐藏在原始格式中的示例 EDMX。

我将在这里重复我的评论:

如果架构位于同一数据库中,则无法在运行时切换它们(仅使用 EF 4 代码除外)。这是因为两个不同模式中两个名称相同且结构相同的表被视为完全不同的表。

我也同意上面的 JMarsch 的观点:我会重新考虑将测试和生产数据(或者实际上是“任何数据和生产数据”)放在同一个数据库中的设计。似乎是一场灾难的邀请。

下面是旧答案。

您确定要更改正确的连接字符串吗?EF 使用的连接字符串嵌入在指定 CSDL/SSDL/等位置的连接字符串内。通常有一个“正常”连接字符串供应用程序的其他部分(例如 ASP.NET 成员资格)使用。在这种情况下,更改数据库时,您必须更新两个连接字符串。

同样,如果您在运行时更新连接字符串,则必须为此使用特定的工具,这些工具了解 EF 连接字符串格式并且与通常的连接字符串生成器分开。请参阅链接中的示例。另请参阅有关分配 EF 连接字符串的帮助