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

asp.net c# entity-framework

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

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

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

见下文

<EntitySet 
    Name="task" 
    EntityType="hardModel.Store.task" 
    store:Type="Tables" 
    Schema="test"  />

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

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

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

有什么想法吗?

一般承认的答案

更新在阅读您的注释后,很明显您希望更改每个数据库的引用模式, 而不是数据库。我已经编辑了这个问题以澄清这一点并恢复您提供的样本EDMX,它隐藏在原始格式中。

我将在下面重复我的评论:

如果架构在同一个DB中, 则无法在运行时切换它们(除了仅使用EF 4代码)。这是因为两个不同模式中的两个具有相同名称和结构的表被认为是完全不同的表。

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

下面的老答案。

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

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


热门答案

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

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因