La version de SQL Server utilisée ne prend pas en charge le type de données 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

J'ai un site Web utilisant Entity Framework. Il y a quelques mois, j'ai ajouté une nouvelle table et ajouté quelques colonnes aux tables existantes; tout a bien fonctionné.

Aujourd'hui, j'ai mis à jour le mappage de L'EDMX afin que la nouvelle table et la nouvelle colonne puissent être utilisées, et j'ai ajouté WebMethods à mes services.fichier asmx. Depuis lors, Je ne peux pas exécuter mon site parce que j'ai cette erreur que je ne peux pas comprendre. Expliquez - moi si vous comprenez, et dites-moi Où est mon erreur.

Je n'ai pas utilisé datetime2 n'importe où. Il n'y a pas un tel type de données dans ma nouvelle table, ni dans les colonnes que j'ai ajoutées aux tables existantes.

La version de SQL sur mon PC est SQL2008 R2, sur le serveur J'ai SQL2008. Je n'ai pas la possibilité de mettre à niveau le serveur vers R2.

25
demandé sur Pondlife 2012-04-19 12:34:25

5 réponses

En plus de la réponse @Mithrandir, validez que votre base de données s'exécute au niveau de compatibilité défini sur 100 (SQL 2008).

Vous n'avez pas à utiliser DATETIME2 dans votre base de données pour obtenir cette erreur. Cette erreur se produit généralement une fois que vous ajoutez requis (NOT NULL) DATETIME colonne à la table existante et vous ne définissez pas la valeur avant d'enregistrer l'entité dans la base de données. Dans ce cas,. net enverra une valeur par défaut qui est 1.1.0001 et cette valeur ne rentre pas dans la plage DATETIME. Ceci (ou quelque chose de similaire) sera la source de votre problème.

18
répondu Ladislav Mrnka 2012-04-19 09:47:03

Avez-vous essayé d'ouvrir votre fichier EDMX avec L'éditeur XML et vérifiez la valeur de ProviderManifestToken. Cela peut aider à passer de ProviderManifestToken=”2008” à ProviderManifestToken=”2005”.

77
répondu Mithrandir 2012-04-19 09:18:21

Ouvrez votre EDMX dans un éditeur de fichiers (ou "ouvrir avec..." dans Visual Studio et sélectionnez Éditeur XML). En haut, vous trouverez le modèle de stockage et il a un attribut ProviderManifestToken. Cela devrait avoir la valeur 2008. Changez cela en 2005, recompilez et tout fonctionne.

Remarque: vous devrez le faire chaque fois que vous mettez à jour le modèle à partir de la base de données.

12
répondu Maher Ben Issa 2013-12-15 13:52:09

Les autres solutions ont fonctionné pour moi mais j'avais besoin d'une solution plus permanente qui ne serait pas retournée chaque fois que l'edmx était mis à jour à partir de la base de données. J'ai donc créé un "événement de pré-construction" pour modifier automatiquement le ProviderManifestToken.

Lien vers la réponse originale: https://stackoverflow.com/a/8764394/810850

L'étape prebuild ressemble à ceci:

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

Le code est ici:

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);
            }
        }
    }
}
3
répondu Ben Anderson 2017-05-23 11:54:09

Code première Solution de contournement.

J'ai eu cette erreur lors de l'exécution d'une requête LINQ select, et changer L'EDMX n'est pas une option pour moi (le Code n'a D'abord pas EDMX), et je ne voulais pas implémenter ceci Comment configurer ProviderManifestToken pour le Code EF en premier pour une requête Linqpad qui n'entrait pas dans]}

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

Je l'ai corrigé en changeant query null vérifier d'abord:

var query =
    from c in context.People
    where (c.Birthday.HasValue && (c.Birthday > birthDay) )
    select c;
0
répondu Walter Stabosz 2018-02-07 17:00:40