Использование SQL Server 2008 и SQL Server 2005 и дата времени

Я создал модель фреймворка сущности для базы данных 2008 года. Все работает нормально с базой данных 2008 года. Когда я пытаюсь обновить объект в базе данных 2005 года, я получаю эту ошибку.

The version of SQL Server in use does not support datatype 'datetime2

Я специально не использовал никаких функций 2008, когда я создал базу данных. Я не могу найти ссылку на datetime2 в коде. И, да, столбец определяется как "дата-время" в базе данных.

4b9b3361

Быстрый google указывает мне на то, что выглядит как решение.

Откройте EDMX в редакторе файлов (или "откройте с..." в Visual Studio и выберите Редактор XML). В верхней части вы найдете модель хранилища и имеет атрибут ProviderManifestToken. Это должно иметь значение 2008. Измените это на 2005 год, перекомпилируйте и все будет работать.

ПРИМЕЧАНИЕ. Вам нужно будет делать это каждый раз, когда вы обновляете модель из базы данных.

192
ответ дан 25 нояб. '08 в 9:31
источник

Быстрый просмотр строки:

<Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >
12
ответ дан 06 февр. '10 в 2:46
источник

Это очень неприятно, и я удивлен, что MS решила не делать этого, чтобы вы могли настроить таргетинг на данную версию SQL. Чтобы убедиться, что мы нацелены на 2005 год, я написал простое консольное приложение и вызываю его на этапе PreBuild.

Шаг предварительной сборки выглядит следующим образом:

$(SolutionDir)Artifacts\SetEdmxVer\SetEdmxSqlVersion $(ProjectDir)MyModel.edmx 2005

Код находится здесь:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace SetEdmxSqlVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            if (2 != args.Length)
            {
                Console.WriteLine("usage: SetEdmxSqlVersion <edmxFile> <sqlVer>");
                return;
            }
            string edmxFilename = args[0];
            string ver = args[1];
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(edmxFilename);

            XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
            mgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx");
            mgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl");
            XmlNode node = xmlDoc.DocumentElement.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema", mgr);
            if (node == null)
            {
                Console.WriteLine("Could not find Schema node");
            }
            else
            {
                Console.WriteLine("Setting EDMX version to {0} in file {1}", ver, edmxFilename);
                node.Attributes["ProviderManifestToken"].Value = ver;
                xmlDoc.Save(edmxFilename);
            }
        }
    }
}
11
ответ дан 06 янв. '12 в 23:55
источник

Используя приложение @Vance handy console выше, я использовал следующее как событие BeforeBuild

<Target Name="BeforeBuild">
    <!--Check out BD.edmx, Another.edmx, all configs-->
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\DB.edmx" />
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\Another.edmx" />
    <!--Set to 2008 for Dev-->
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <!--Set to 2005 for Deployments-->
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
  </Target>

Это очень удобно, так как позволяет избежать раздражающего перераспределения. Спасибо, что поделились Vance.

Я добавил файл TF.exe в папку с библиотекой, и это помогает, так как теперь я могу проверить файлы edmx, прежде чем пытаться их редактировать, как часть сборки. Кроме того, я добавил это с условиями, так что он устанавливает на 2005 год для развертывания на сервере и обратно до 2008 года для конфигураций sln Dev. Кроме того, вам нужно добавить файлы SetEdmxSqlVersion.exe(и .pdb) в папку библиотеки (или где бы вы ни захотели сохранить эти биты).

Большое спасибо @Vance. Действительно аккуратная, массивная экономия времени и сохраняет мои сборки полностью автоматизированными и безболезненными.

4
ответ дан 28 марта '12 в 23:07
источник

В интересах людей, которые сталкиваются с одной и той же проблемой, но используют Первый код, посмотрите мой ответ здесь о том, как изменить ProviderManifestToken в коде First. Он включает создание DbModelBuilder вручную и передачу экземпляра DbProviderInfo (с соответствующим токеном) при вызове метода построителя модели Build.

2
ответ дан 21 авг. '12 в 21:22
источник

Лучшее решение для меня вместо ручного редактирования EDMX файла - это просто открыть edmx в режиме разработки и в контекстном меню "Обновить модель из базы данных...". Конечно, вы должны указывать на правильную версию SQL, что бы это ни было для вас.

1
ответ дан 30 марта '11 в 14:29
источник

У нас была аналогичная проблема с 2012 по 2008 год. Она может быть решена с помощью события BeforeBuild с использованием XmlPeek и XmlPoke:

   <Target Name="BeforeBuild">
      <XmlPeek XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken">
         <Output TaskParameter="Result" ItemName="TargetedSQLVersion" />
      </XmlPeek>

      <XmlPoke Condition="@(TargetedSQLVersion) != 2008"
               XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken"
               Value="2008">
      </XmlPoke>
   </Target>

Если вам не нравится автоматическая замена, вы можете просто заменить задачу XmlPoke задачей "Ошибка".

1
ответ дан 08 марта '16 в 15:10
источник