正在使用的SQL Server版本不支持数据类型datetime2?

时间:2012-04-19 08:34:26

标签: sql sql-server entity-framework entity-framework-4 linq-to-entities

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 。我的新表中没有这样的数据类型,也没有添加到现有表中的列。

我的PC上的SQL版本是SQL2008 R2,在我有SQL2008的服务器上。我没有选择将服务器升级到R2。

5 个答案:

答案 0 :(得分:78)

您是否尝试使用XML编辑器打开EDMX文件并检查ProviderManifestToken的值。从ProviderManifestToken=”2008”更改为ProviderManifestToken=”2005”可能会有所帮助。

答案 1 :(得分:18)

除了@Mithrandir之外,还要验证您的数据库是否在兼容级别设置为100(SQL 2008)的情况下运行。

您不必在数据库中使用DATETIME2来获取此错误。一旦将所需的(NOT NULLDATETIME列添加到现有表,并且在将实体保存到数据库之前未设置该值,通常会发生此错误。在这种情况下,.NET将发送默认值1.1.0001,该值不适合DATETIME范围。这(或类似的东西)将成为您问题的根源。

答案 2 :(得分:12)

在文件编辑器中打开您的EDMX(或在Visual Studio中“以...打开”并选择XML编辑器)。在顶部,您将找到存储模型,它具有属性ProviderManifestToken。这应该具有值2008.将其更改为2005,重新编译并且一切正常。

注意:每次从数据库更新模型时,您都必须这样做。

答案 3 :(得分:3)

其他解决方案对我有用,但我需要一个更永久的解决方案,每次从数据库更新edmx时都不会还原。所以我创建了一个"预制活动"自动修改ProviderManifestToken。

链接到原始答案: https://stackoverflow.com/a/8764394/810850

预建步骤如下所示:

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

答案 4 :(得分:1)

Code First解决方法。

运行linq select查询时出现此错误,更改EDMX对我来说不是一个选项(Code First没有EDMX),我不想为Linqpad实现此How to configure ProviderManifestToken for EF Code First未进入生产代码的查询:

// [dbo].[People].[Birthday] is nullable

DateTime minBirthday = DateTime.Now.AddYears(-18);

var query =
    from c in context.People
    where c.Birthday > birthday
    select c;

var adults = query.ToList();

我通过将query更改为空检查来修复它:

var query =
    from c in context.People
    where (c.Birthday.HasValue && (c.Birthday > birthDay) )
    select c;