Использование Entity Framework с другой версией SQL Server - PullRequest
5 голосов
/ 27 ноября 2009

Я думаю, что большинство из вас может работать с последней версией SQL Server и развернуть ее на целевом компьютере, на котором установлена ​​относительно старая версия. Например, использовать SQL Server 2008 на производственном компьютере и SQL Server 2005 на целевом сервере. Работая в такой ситуации с Entity Framework, я немного расстроился.

Я разработал схему базы данных с использованием SQL Server 2008, у меня есть поле таблицы типа datatime. приложение отлично работает на моей машине. Но на целевом сервере структура сущностей создает запрос T-SQL для SQL Server 2008, что приведет к тому, что тип данных не будет поддерживать исключение (datatime2). Единственное, что я знаю, это изменяю ProviderManifestToken в файле edmx каждый раз, когда вы обновляете модель сущности. Есть ли способ сделать эту работу умнее? Спасибо!

Ответы [ 4 ]

5 голосов
/ 27 ноября 2009

Вы должны изменить атрибут ProviderManifestToken вручную. Мастер обновлений не сделает это за вас.

3 голосов
/ 27 ноября 2009

ОБНОВЛЕНИЕ: Я написал совет в своем блоге в моей серии советов , чтобы рассказать об этом чуть подробнее.

-

Как вы уже догадались, ключом к этому является ProviderManifestToken.

EF использует это, чтобы установить, какие типы баз данных доступны.

Очевидно, что если часть SSDL (модель хранилища или модели базы данных) типов ссылок EDMX не поддерживается в конкретной версии SQL-сервера, вам потребуется изменить не только ProviderManifestToken, но и заменить все ссылки на типы, не поддерживаемые в целевая версия тоже.

Один из подходов к этому состоит в том, чтобы трактовать часть файла SSDL как нечто, что может быть заменено во время выполнения.

Для этого вам нужно извлечь CSDL / MSL / SSDL в файлы, а не встраивать их в сборку, как это стандартно:

  1. Щелкните правой кнопкой мыши дизайнер холст
  2. Выбрать свойства
  3. Установите для параметра «Обработка артефактов метаданных» значение «Копировать в выходной каталог»
  4. Сложение
  5. Теперь вам нужно скопировать файл SSDL (в bin \ debug) и изменить его для работы с SQL2005, заменив ссылки на DateTime2 на DateTime и т. Д.
  6. Затем во время выполнения при создании контекста объекта вам нужно вручную создать ConnectionString, чтобы он указывал на правильный SSDL ...

И используйте это так:

var connStr = @"metadata=.\model.csdl|.\modelSQL2005.ssdl|.\model.msl;
              provider=System.Data.SqlClient;
              provider connection string="
                  Data Source=.\SQLEXPRESS;
                  Initial Catalog=TipsDatabase;
                  Integrated Security=True;
                  MultipleActiveResultSets=True
              "";

using (var ctx = new MyContext(connStr))
{

}

Я знаю, что это не идеально, но, по крайней мере, оно дает вам работоспособное решение.

Надеюсь, это поможет

Alex

1 голос
/ 02 мая 2011

Используя MSBuild.Community Tasks , я добавил цель BeforeBuild, которая использует задачу XmlUpdate, чтобы всегда менять ProviderManifestToken на 2005, в случае, если кто-то изменил ее, обновив модель данных.

Вот цель BeforeBuild:

<Target Name="BeforeBuild">
<XmlUpdate Prefix="ssdl"
            Namespace="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"
            XPath="//ssdl:Schema/@ProviderManifestToken"
            XmlFileName="Model.edmx"
            Value="2005"/>
0 голосов
/ 27 ноября 2009

Вы можете попробовать установить режим совместимости вашей базы данных.

Таким образом, даже если вы используете SQL 2008 Server, база данных является базой данных SQL Server 2005.

Я не проверял это, но теоретически это должно заставить EF думать, что он обращается к базе данных SQL Server 2005.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...