这至少让我有点恼火......
我正在将服务层项目升级到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}来源数据库ProviderManifestToken
为2005
。
然而,对我而言,我必须创建不同的程序集纯粹只是为了满足EF中的一个行为,可以使一个EDMX打破所有其他程序,这是荒谬的 - 对我来说,单独的程序集是一个架构决策。同样地,攻击EDMX文件以降级2008数据库也是不可取的,尤其是当下一个“从数据库更新...”命令将再次更改它时。
有人有另一种解决方案吗?
答案 0 :(得分:4)
使用EDMX和设计师时没有替代解决方案。 EDMX固定为单个数据库实现。在SQL Server的情况下,它更糟糕,因为它在SQL Server 2005和2008方言之间有所不同(我们可以预期2012年将来)。一旦使用EDMX,这种与数据库实现的紧密耦合就是SSDL(EDMX中的数据库描述)的一部分。如果您还使用VS的默认EF设计器,则无法完全控制SSDL - 当您从数据库更新模型或从模型生成数据库时,始终会重新创建它。
目前的解决方案是: