Несколько версий SQL Server с использованием Entity Framework в одном приложении ASP.NET

Я использую Entity Framework в веб-приложении, использующем SQL Server 2000, 2005 и 2008. Когда я создаю новый файл EDMX, используя что-либо, кроме 2008 (версия первого созданного edmx), я получаю error 0172: All SSDL artifacts must target the same provider. The Provider 'MyDatabase' is different from ' MyDatabase ' that was encountered earlier. Кажется, что где-то в code соединение подключено к хранилищу данных 2008 года, и когда он проверяет файл SSDL и видит другое значение ProviderManifestToken, он выдает эту ошибку. Я немного более чем расстроен. Трудно представить, что EF будет работать только с одной версией Sql Server для каждого приложения. Я совершенно уверен, что должна быть настройка или обходной путь. У кого-нибудь есть решение для использования разных версий SQL-сервера и Entity Framework в одном веб-приложении?


person Ian B    schedule 30.06.2009    source источник
comment
Важно отметить, что я нахожусь в середине миграции с sql 2000 на sql 2008 и изменил строки подключения и выполнил обновление модели из базы данных, как ни странно, если я модифицирую все SSDL для использования ProviderManifestToken = 2005, приложение работает.   -  person Ian B    schedule 30.06.2009
comment
Я тоже ищу ответ на эту проблему. Единственные релевантные результаты Google, которые я нашел до сих пор, не углубляются.   -  person Cogwheel    schedule 16.10.2009


Ответы (2)


Я смог добиться этого, поместив каждый 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 
              };
person Cogwheel    schedule 16.10.2009
comment
Я вижу, где это сработает. Вопрос, который я рассматривал, заключался в том, почему он не работал в моей среде. Единственным обходным решением в то время было установить для всех ProviderManifestToken одну и ту же версию. С тех пор я перенес все базы данных на MSSQL 2008. Так почему это может не ответить на мой первоначальный вопрос, это приемлемый обходной путь. - person Ian B; 03.12.2009
comment
У меня была такая же проблема. Затем я реализовал все, что описано в предложении @Cogwheel - Matthew Orlando, и он отлично работает как для серверов sql 2005, так и для 2008. Примечание. Я создал новый проект для доступа к данным в SQL 2008 с именем diff, а затем скопировал все содержимое из первого и исправил "ProviderManifestToken" для соответствующей версии sql, а затем заменил пространства имен во втором проекте - в соответствии с новым именем сборки (не знаю, было ли это необходимо). И теперь я счастлив. - person mastak; 05.10.2010
comment
+1 У меня это сработало при загрузке edmx для SQL Server и одного для Sybase SQL Anywhere из разных сборок. - person dmck; 08.10.2012
comment
+1 У меня был Oracle edmx и edmx Sql Server, так что это дало мне подсказку попробовать поместить каждый edmx в свой собственный проект (например, App.OracleModel и App.SqlServerModel), теперь все работает. Спасибо! - person Robert Koch; 11.11.2013
comment
Чувак, ты здорово спас жизнь! Спасибо! - person Filling The Stack is What I DO; 12.11.2013

Эта ссылка помогла мне решить проблему, когда была разница в SQL Server 2005 и 2008. http://kkryczka.wordpress.com/2011/01/03/all-ssdl-artifacts-must-target-тотже-поставщик-токен-манифеста-поставщика-2008-отличается-от-2005-который-встречался-ранее/

Щелкните правой кнопкой мыши файл .edmx и выберите «Открыть с помощью редактора XML». Откройте файл Entity Framework .edmx:

Измените ProviderManifestToken на 2008:

Похоже, это известная проблема для Microsoft.

person franklins    schedule 27.01.2011
comment
Спасибо чувак. Я действительно боролся с этим. Другой разработчик продолжал добавлять в наш проект другой манифест провайдера. Хорошая статья - person Ian B; 28.01.2011
comment
В моем случае я обнаружил, что у нас было 3 проекта в одном решении, и мы изменили ProviderManifestToken в одном из проектов A, и это не позволило мне запустить даже проект B из того же решения. - person franklins; 28.01.2011
comment
В моем случае мне пришлось изменить 2008 на 2012, и в нижней части файла вы найдете: ‹DesignerProperty Name=UseLegacyProvider Value=True /›. Измените это на False, и это сработает. - person Martin; 28.10.2016