【问题标题】:Multiple Versions of SQL Server using Entity Framework in a single ASP.NET application在单个 ASP.NET 应用程序中使用实体框架的多个 SQL Server 版本
【发布时间】:2010-11-06 21:06:34
【问题描述】:

我在使用 SQL Server 2000、2005 和 2008 的 Web 应用程序中使用实体框架。当我使用 2008 以外的任何东西(创建的第一个 edmx 的版本)创建新的 EDMX 文件时,我收到 error 0172: All SSDL artifacts must target the same provider. The Provider 'MyDatabase' is different from ' MyDatabase ' that was encountered earlier. 它似乎代码中的某处连接到 2008 数据存储,当它检查 SSDL 文件并看到不同的 ProviderManifestToken 值时,它会引发此错误。我有点沮丧。很难想象 EF 将仅适用于每个应用程序的单个版本的 Sql Server。我相当确定必须有一个设置或解决方法。有没有人可以在单个 Web 应用程序中使用不同版本的 SQL Server 和实体框架?

【问题讨论】:

  • 要提的一个重要事项是,我正在从 sql 2000 迁移到 sql 2008 并且已经更改了连接字符串并奇怪地执行了“从数据库更新模型”,如果我修改使用 ProviderManifestToken = "2005" 的所有 SSDL 应用都可以正常工作。
  • 我也在寻找这个问题的答案。到目前为止,我发现的唯一相关的谷歌结果没有深入。

标签: sql-server-2005 entity-framework sql-server-2000 entity


【解决方案1】:

我可以通过将每个 edmx 放在一个单独的程序集中来实现这一点。然后在连接字符串中,将所有res://*/...替换为res://NameOfAssembly/...

我什至可以在两个实体模型之间执行连接(与我在其他来源中发现的声明相反),例如:

var oneDb = new Entities2000();
var otherDb = new Entities2005();

var results = from one in oneDb.SomeSet
              join other in otherDb.OtherSet
                  on one.Property equals other.Property
              select new { 
                  SomeProp = one.SomeProp,
                  OtherProp = other.OtherProp 
              };

【讨论】:

  • 我知道这会在哪里起作用。我正在研究的问题是为什么它在我的环境中不起作用。当时唯一的解决方法是将所有 ProviderManifestToken 设置为相同的版本。由于这次我已将所有数据库迁移到 MSSQL 2008。那么为什么这可能无法回答我最初的问题,这是一个可以接受的解决方法。
  • 我遇到了同样的问题。然后我实现了“@Cogwheel - Matthew Orlando”建议中描述的所有内容,它适用于 sql server 2005 和 2008。注意:我创建了一个新项目,用于使用 diff 名称访问 SQL 2008 的数据,然后从第一个复制所有内容并为相应的 sql 版本修复了“ProviderManifestToken”,然后根据新的程序集名称替换了第二个项目中的命名空间(不知道是否有必要)。现在我很开心。
  • +1 从不同的程序集加载一个用于 SQL Server 的 edmx 和一个用于 Sybase SQL Anywhere 的 edmx 时,这对我有用
  • +1 我有一个 Oracle edmx 和一个 Sql Server edmx,所以这给了我一个提示,让我尝试将每个 edmx 放在自己的项目中(例如 App.OracleModel 和 App.SqlServerModel),现在一切正常.谢谢!
  • 老兄,你救了你的命!谢谢!
【解决方案2】:

当 SQL server 2005 和 2008 存在差异时,此链接帮助我解决了问题。 http://kkryczka.wordpress.com/2011/01/03/all-ssdl-artifacts-must-target-the-same-provider-the-providermanifesttoken-2008-is-different-from-2005-that-was-encountered-earlier/

右键单击 .edmx 文件并选择使用 XML 编辑器打开。 打开实体框架 .edmx 文件:

将 ProviderManifestToken 更改为 2008:

看起来这是 Microsoft 的一个已知问题。

【讨论】:

  • 谢谢伙计。我真的很挣扎这个。另一位开发人员不断向我们的项目添加不同的 providermanifest。好文章
  • 我在我的案例中发现的是,我们在一个解决方案中有 3 个项目,我们已经更改了其中一个项目 A 中的 ProviderManifestToken,这并没有让我从同一个项目中运行项目 B解决方案。
  • 在我的情况下,我必须从 2008 年到 2012 年进行更改,并在文件底部找到:。将其更改为 False 并且它起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多