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。
答案 0 :(得分:78)
您是否尝试使用XML编辑器打开EDMX文件并检查ProviderManifestToken
的值。从ProviderManifestToken=”2008”
更改为ProviderManifestToken=”2005”
可能会有所帮助。
答案 1 :(得分:18)
除了@Mithrandir之外,还要验证您的数据库是否在兼容级别设置为100(SQL 2008)的情况下运行。
您不必在数据库中使用DATETIME2
来获取此错误。一旦将所需的(NOT NULL
)DATETIME
列添加到现有表,并且在将实体保存到数据库之前未设置该值,通常会发生此错误。在这种情况下,.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)
运行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;