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を使用しているWebサイトがあります。数か月前に新しいテーブルを追加し、既存のテーブルにいくつかの列を追加しました。すべてがうまくいきました。
今日、私はEDMXのマッピングを更新して、新しいテーブルと新しい列を使用できるようにし、WebMethodsをservices.asmxファイルに追加しました。それ以来、理解できないエラーが発生したため、サイトを実行できません。理解できたら説明してください。間違いはどこにあるのか教えてください。
私はdatetime2をどこでも使用していません。新しいテーブルにも、既存のテーブルに追加した列にも、そのようなデータ型はありません。
私のPCのSQLのバージョンはSQL2008 R2で、サーバーにSQL2008があります。サーバーをR2にアップグレードするオプションがありません。
@Mithrandirの回答に加えて、データベースが100(SQL 2008)に設定された互換性レベルで実行されていることを確認します。
このエラーを取得するために、データベースでDATETIME2
を使用する必要はありません。このエラーは通常、必要な(NOT NULL
)DATETIME
列を既存のテーブルに追加し、エンティティをデータベースに保存する前に値を設定しないと発生します。そのような場合、.NETは1.1.0001であるデフォルト値を送信し、この値はDATETIME
の範囲に適合しません。これ(または類似の何か)が問題の原因になります。
XMLエディターでEDMXファイルを開こうとして、ProviderManifestToken
の値を確認しましたか? ProviderManifestToken=”2008”
からProviderManifestToken=”2005”
への変更が役立つ場合があります。
ファイルエディターでEDMXを開きます(またはVisual Studioで[...で開く]をクリックし、[XMLエディター]を選択します)。上部にはストレージモデルがあり、ProviderManifestToken属性があります。この値は2008である必要があります。これを2005に変更して、再コンパイルすると、すべてが機能します。
注:データベースからモデルを更新するたびに、これを行う必要があります。
他の解決策もうまくいきましたが、edmxがデータベースから更新されるたびに元に戻らない、より永続的な解決策が必要でした。そこで、ProviderManifestTokenを自動的に変更する「事前構築イベント」を作成しました。
元の回答へのリンク: https://stackoverflow.com/a/8764394/81085
事前構築ステップは次のようになります。
$(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);
}
}
}
}
Linq selectクエリの実行中にこのエラーが発生し、EDMXを変更することは選択肢にありません(Code FirstにはEDMXがありません)。これを実装したくありません EFコード用にProviderManifestTokenを構成する方法)最初に は、製品コードに含まれていなかったLinqpadクエリの場合:
// [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
をnullチェックに変更して修正しました。
var query =
from c in context.People
where (c.Birthday.HasValue && (c.Birthday > birthDay) )
select c;