27
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

I have a website using Entity Framework. A few months ago I added a new table, and added some columns to existing tables; everything worked fine.

Today I updated the mapping of the EDMX so the new table and the new column can be used, and added WebMethods to my services.asmx file. Since then I cannot run my site because I have that error that I cannot understand. Please explain it to me if you understand, and tell me where is my mistake.

I have not used datetime2 anywhere. There is no such datatype in my new table, nor in the columns that I added to existing tables.

The version of SQL on my PC is SQL2008 R2, on the server i have SQL2008. I do not have the option to upgrade the server to R2.

Pondlife
  • 15,992
  • 6
  • 37
  • 51
Barbara88
  • 277
  • 1
  • 3
  • 6
  • Are you using a CLR procedure? – Milee Apr 19 '12 at 09:02
  • [Datetime2](http://msdn.microsoft.com/en-us/library/bb677335%28v=sql.100%29.aspx) did exist in SQL 2008 anyway, so I think upgrading to R2 on the server wouldn't help you anyway. – Bridge Apr 19 '12 at 09:04
  • 1
    Take a look at the compatibility level of your database (properties->options), is it also SQL Server 2008? – Wim Apr 19 '12 at 09:11
  • 3
    i solved this with using ProviderManifestToken="2005" in the edmx -thanks all:) – Barbara88 Apr 19 '12 at 09:54
  • Possible duplicate of [Entity Framework Error - The version of SQL Server in use does not support datatype 'datetime2'](https://stackoverflow.com/questions/6547051/entity-framework-error-the-version-of-sql-server-in-use-does-not-support-datat) – Frédéric Oct 15 '17 at 11:53
  • But this question here has attracted more attention and answers than its predecessor. – Frédéric Oct 15 '17 at 11:53

5 Answers5

83

Have you tried to open your EDMX file with XML Editor and check the value of ProviderManifestToken. It may help to change from ProviderManifestToken=”2008” to ProviderManifestToken=”2005”.

Mithrandir
  • 24,869
  • 6
  • 50
  • 66
19

In addition to @Mithrandir answer validate that your database is running in compatibility level set to 100 (SQL 2008).

You don't have to use DATETIME2 in your database to get this error. This error happens usually once you add required (NOT NULL) DATETIME column to existing table and you don't set the value prior to saving the entity to database. In such case .NET will send default value which is 1.1.0001 and this value doesn't fit into DATETIME range. This (or something similar) will be source of your problem.

Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
  • I checked my Compatibility level, it's 90(2005). and also checked my script, it does allow null on the datetime field. But still got this error message. Btw, I'm using SQL Server 2012 – Franva Nov 03 '14 at 03:52
12

Open your EDMX in a file editor (or “open with…” in Visual Studio and select XML Editor). At the top you will find the storage model and it has an attribute ProviderManifestToken. This has should have the value 2008. Change that to 2005, recompile and everything works.

NOTE: You'll have to do this every time you update the model from database.

Maher Ben Issa
  • 651
  • 7
  • 12
3

The other solutions worked for me but I needed a more permanent solution that would not be reverted every time the edmx was updated from the database. So I created a "Pre-build event" to modify the ProviderManifestToken automatically.

Link to original answer: https://stackoverflow.com/a/8764394/810850

The prebuild step looks like this:

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

The code is here:

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);
            }
        }
    }
}
Community
  • 1
  • 1
Ben Anderson
  • 7,003
  • 4
  • 40
  • 40
  • That's similar to how I automated it as well. Only difference is I wrote a tool to parse and set any xml tag/attribute, rather one specific one. Has more uses for automated builds... – Ken Forslund Apr 27 '15 at 19:55
1

Code First workaround.

I got this error while running a linq select query, and changing the EDMX isn't an option for me (Code First has no EDMX), and I didn't want to implement this How to configure ProviderManifestToken for EF Code First for a Linqpad query that wasn't going into production code:

// [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();

I fixed it by changing query to null check first:

var query =
    from c in context.People
    where (c.Birthday.HasValue && (c.Birthday > birthDay) )
    select c;
Walter Stabosz
  • 7,447
  • 5
  • 43
  • 75