web-dev-qa-db-ger.com

Die verwendete Version von SQL Server unterstützt nicht den Datentyp 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

Ich habe eine Website mit Entity Framework. Vor einigen Monaten habe ich eine neue Tabelle hinzugefügt und einige Spalten zu vorhandenen Tabellen hinzugefügt. alles hat gut funktioniert.

Heute habe ich die Zuordnung von EDMX aktualisiert, damit die neue Tabelle und die neue Spalte verwendet werden können, und meiner Datei services.asmx WebMethods hinzugefügt. Seitdem kann ich meine Site nicht mehr ausführen, da ich den Fehler habe, den ich nicht verstehe. Erklären Sie es mir bitte, wenn Sie verstehen, und sagen Sie mir, wo mein Fehler liegt.

Ich habe datetime2 nirgends benutzt. In meiner neuen Tabelle und in den Spalten, die ich zu vorhandenen Tabellen hinzugefügt habe, gibt es keinen solchen Datentyp.

Die Version von SQL auf meinem PC ist SQL2008 R2, auf dem Server habe ich SQL2008. Ich habe keine Möglichkeit, den Server auf R2 zu aktualisieren.

25
Barbara88

Überprüfen Sie zusätzlich zur Antwort von @Mithrandir, dass Ihre Datenbank mit der Kompatibilitätsstufe 100 (SQL 2008) ausgeführt wird.

Sie müssen nicht DATETIME2 in Ihrer Datenbank verwenden, um diesen Fehler zu erhalten. Dieser Fehler tritt normalerweise auf, wenn Sie einer vorhandenen Tabelle die erforderliche (NOT NULL) DATETIME-Spalte hinzufügen und den Wert nicht vor dem Speichern der Entität in der Datenbank festlegen. In diesem Fall sendet .NET den Standardwert 1.1.0001, und dieser Wert passt nicht in den Bereich DATETIME. Dies (oder etwas ähnliches) ist die Ursache Ihres Problems.

18
Ladislav Mrnka

Haben Sie versucht, Ihre EDMX-Datei mit XML Editor zu öffnen, und überprüfen Sie den Wert von ProviderManifestToken. Es kann hilfreich sein, von ProviderManifestToken=”2008” zu ProviderManifestToken=”2005” zu wechseln. 

78
Mithrandir

Öffnen Sie Ihr EDMX in einem Datei-Editor (oder „Öffnen mit…“ in Visual Studio und wählen Sie XML-Editor). Oben finden Sie das Speichermodell und es hat ein Attribut ProviderManifestToken. Dies sollte den Wert 2008 haben. Ändern Sie das auf 2005, kompilieren Sie neu und alles funktioniert.

HINWEIS: Sie müssen dies jedes Mal tun, wenn Sie das Modell von der Datenbank aus aktualisieren.

12
Maher Ben Issa

Die anderen Lösungen funktionierten für mich, aber ich brauchte eine dauerhaftere Lösung, die nicht bei jeder Aktualisierung des edmx aus der Datenbank wiederhergestellt werden würde. Also habe ich ein "Pre-build-Ereignis" erstellt, um das ProviderManifestToken automatisch zu ändern. 

Link zur ursprünglichen Antwort: https://stackoverflow.com/a/8764394/810850

Der Vorbauschritt sieht folgendermaßen aus:

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

Der Code ist hier:

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
Ben Anderson

Code Erste Problemumgehung.

Ich habe diesen Fehler beim Ausführen einer Linq-Select-Abfrage erhalten, und das Ändern des EDMX ist für mich keine Option (Code First hat kein EDMX). Ich wollte das nicht implementieren. So konfigurieren Sie ProviderManifestToken für EF Code First für eine Linqpad-Abfrage, die nicht in den Produktionscode ging:

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

Ich habe es behoben, indem ich query zuerst auf null überprüfte: 

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