【问题标题】:EF and Multiple SQL Versions in one assembly - is it possible一个程序集中的 EF 和多个 SQL 版本 - 是否可能
【发布时间】:2012-05-14 08:42:06
【问题描述】:

至少可以说这让我有点恼火......

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

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 数据库也是不可取的,尤其是当下一个“从数据库更新...”命令将再次更改它时。

有人有替代解决方案吗?

【问题讨论】:

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


    【解决方案1】:

    使用 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 设计器。

    【讨论】:

    • 好吧,这很糟糕。那好吧。 +1 & acc,尽管这是个坏消息 :)
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多