2012-05-14 24 views
1

这让我有点恼火,至少可以说...EF和一个装配多个SQL版本 - 这可能

我升级服务层项目,体验最新版本,并在这个过程中“将我所有的Linq升级到Sql模型到Entity Framework。到目前为止,我已经完成了四个数据库,现在正在运行测试 - 我的测试失败,出现错误

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

做一些谷歌搜索我发现这通常是由不同的开发/活的SQL服务器版本引起的。

我的情况是不同的,但是 - 我有多个活动数据库服务器上运行不同的版本 - 2005年,2008年和2008 R2 - 我需要能够交谈的所有的人,用不同的EDMXs。

对此SO:Multiple Versions of SQL Server using Entity Framework in a single ASP.NET application看来,一种解决方案是将不同版本的EDMX分成不同的组件(即2005和2008版本)。据推测,另一个解决方案将迫使我的ProviderManifestToken在2008年源数据库为2005。然而,对我而言,我必须创建不同的程序集纯粹只是为了满足EF中的一个行为怪癖,可以让一个EDMX打破所有其他程序的想法是荒谬的 - 对我来说,单独的程序集是一个架构决策。同样地,黑客使用EDMX文件降级2008数据库也是不可取的,尤其是当下一次“从数据库更新...”命令将其再次更改时。

任何人有一个替代的解决方案?

回答

4

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

目前的解决方案是:在发展和VS设计师

  • 使用SQL Server 2005将不会覆盖您的供应商清单。此配置也应该在SQL Server 2008和2008 R2上运行。
  • 使用代码第一(EF 4.1 - 4.3.1)在那里,这是在运行时
  • 自动处理,而不是EDMX不要VS设计师使用,并手动维护EDMX或买一些更强大的设计师
  • 创建独立的SSDL部分用于SQL Serve 2005和2008,并根据使用的数据库实现在连接字符串中正确引用它们。这样做有许多缺点,例如维护两个几乎相同的SSDL文档,并且再次使用VS设计器。
+0

好,吸住。好吧。 +1&acc即使它是坏消息:) –