EF和多个SQL版本在一个程序集中 - 是否可能

时间:2012-05-14 08:42:06

标签: .net entity-framework entity-framework-4

这至少让我有点恼火......

我正在将服务层项目升级到v.next,并且正在将我的所有Linq到Sql模型“升级”到Entity Framework。到目前为止,我已经完成了四个数据库,现在正在运行测试 - 我的测试失败并出现错误

  

System.Data.MetadataException:指定的架构无效。错误:   DB.WebDB.ssdl(2,84):错误0169:所有SSDL工件必须以同一提供程序为目标。 ProviderManifestToken'2008'与之前遇到的'2005'不同。

做一些谷歌搜索我发现这通常是由不同的dev / live sql server版本引起的。

我的情况有所不同 - 但我有多个运行不同版本的实时数据库服务器--2005,2008和2008 R2 - 我需要能够与所有这些服务器通过不同的EDMX进行通信。

在这个SO:Multiple Versions of SQL Server using Entity Framework in a single ASP.NET application上,似乎有一个解决方案是将不同版本的EDMX分成不同的程序集(即2005和2008版本)。据推测,另一个解决方案是强制{2008}来源数据库ProviderManifestToken2005

然而,对我而言,我必须创建不同的程序集纯粹只是为了满足EF中的一个行为,可以使一个EDMX打破所有其他程序,这是荒谬的 - 对我来说,单独的程序集是一个架构决策。同样地,攻击EDMX文件以降级2008数据库也是不可取的,尤其是当下一个“从数据库更新...”命令将再次更改它时。

有人有另一种解决方案吗?

1 个答案:

答案 0 :(得分:4)

使用EDMX和设计师时没有替代解决方案。 EDMX固定为单个数据库实现。在SQL Server的情况下,它更糟糕,因为它在SQL Server 2005和2008方言之间有所不同(我们可以预期2012年将来)。一旦使用EDMX,这种与数据库实现的紧密耦合就是SSDL(EDMX中的数据库描述)的一部分。如果您还使用VS的默认EF设计器,则无法完全控制SSDL - 当您从数据库更新模型或从模型生成数据库时,始终会重新创建它。

目前的解决方案是:

  • 在开发中使用SQL Server 2005,VS设计器不会覆盖您的提供程序清单。此配置也适用于SQL Server 2008和2008 R2。
  • 首先使用代码(EF 4.1 - 4.3.1)代替EDMX(在运行时自动处理)
  • 不要使用VS设计师并手动维护您的EDMX或购买更强大的设计师
  • 为SQL Serve 2005和2008创建单独的SSDL部件,并根据使用的数据库实现在连接字符串中正确引用它们。这有许多缺点,比如维护两个几乎相同的SSDL文档,再次无法使用VS设计器。