Подтвердить что ты не робот

Используемая версия SQL Server не поддерживает тип данных datetime2?

An error occurred while executing the command definition. See the inner exception for details. bbbbInnerException:aaaa System.ArgumentException: The version of SQL Server in use does not support datatype 'datetime2'.

   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)

   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)

   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)

   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)

   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)

   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)

   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)

   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavioR

У меня есть веб-сайт с использованием Entity Framework. Несколько месяцев назад я добавил новую таблицу и добавил некоторые столбцы в существующие таблицы; все работает нормально.

Сегодня я обновил отображение EDMX, чтобы можно было использовать новую таблицу и новый столбец, а также добавить WebMethods в мой файл services.asmx. С тех пор я не могу запустить свой сайт, потому что у меня есть эта ошибка, которую я не могу понять. Пожалуйста, объясните это мне, если вы поймете, и скажите мне, где моя ошибка.

Я не использовал datetime2 в любом месте. В моей новой таблице нет такого типа данных, ни в столбцах, которые я добавил в существующие таблицы.

Версия SQL на моем компьютере - SQL2008 R2, на сервере у меня есть SQL2008. У меня нет возможности обновить сервер до R2.

4b9b3361

Ответ 1

В дополнение к ответу @Mithrandir подтвердите, что ваша база данных работает на уровне совместимости, установленном в 100 (SQL 2008).

Вам не нужно использовать DATETIME2 в своей базе данных для получения этой ошибки. Эта ошибка возникает, как только вы добавляете требуемый столбец (NOT NULL) DATETIME в существующую таблицу, и вы не устанавливаете значение до сохранения объекта в базе данных. В таком случае .NET отправит значение по умолчанию, которое равно 1.1.0001, и это значение не соответствует диапазону DATETIME. Это (или что-то подобное) станет источником вашей проблемы.

Ответ 2

Вы пытались открыть файл EDMX с помощью XML-редактора и проверить значение ProviderManifestToken. Это может помочь изменить значение от ProviderManifestToken="2008" до ProviderManifestToken="2005".

Ответ 3

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

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

Ответ 4

Другие решения работали для меня, но мне нужно было более постоянное решение, которое не возвращалось бы каждый раз, когда edmx был обновлен из базы данных. Поэтому я создал событие "Pre-build", чтобы автоматически изменить ProviderManifestToken.

Ссылка на исходный ответ: fooobar.com/info/49903/...

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

$(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);
            }
        }
    }
}