Sql server 2005 使用SQL Server 2008和SQL Server 2005以及日期时间

Sql server 2005 使用SQL Server 2008和SQL Server 2005以及日期时间,sql-server-2005,entity-framework,sql-server-2008,datetime,datetime2,Sql Server 2005,Entity Framework,Sql Server 2008,Datetime,Datetime2,我已经针对2008年的数据库构建了一个实体框架模型。在2008年的数据库中一切正常。当我试图更新2005年数据库上的实体时,我得到了这个错误 The version of SQL Server in use does not support datatype 'datetime2 正在使用的SQL Server版本不支持数据类型“datetime2” 在构建数据库时,我没有使用任何2008特性。我在代码中找不到对datetime2的任何引用。是的,该列在数据库中定义为“datetime” 一个快

我已经针对2008年的数据库构建了一个实体框架模型。在2008年的数据库中一切正常。当我试图更新2005年数据库上的实体时,我得到了这个错误

The version of SQL Server in use does not support datatype 'datetime2 正在使用的SQL Server版本不支持数据类型“datetime2”
在构建数据库时,我没有使用任何2008特性。我在代码中找不到对datetime2的任何引用。是的,该列在数据库中定义为“datetime”

一个快速的谷歌指向我看起来像

在文件编辑器中打开EDMX(或在Visual Studio中“使用…”打开,然后选择XML编辑器)。在顶部,您将找到存储模型,它有一个属性ProviderManifestToken。这应该有2008年的价值。将其更改为2005年,重新编译,一切正常

注意:每次从数据库更新模型时都必须执行此操作。

快速查看行:

<Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >

对我来说,更好的解决方案是不用手动编辑EDMX文件,只要在设计模式下打开EDMX,并在上下文菜单“从数据库更新模型…”中打开即可。
当然,不管这对你来说是什么,你都必须指向正确的SQL版本。

这非常令人沮丧,我很惊讶MS决定不这样做,这样你就可以针对给定的SQL版本。为了确保我们的目标是2005年,我编写了一个简单的控制台应用程序,并在预构建步骤中调用它

预构建步骤如下所示:

$(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);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
命名空间SetEdmxSqlVersion
{
班级计划
{
静态void Main(字符串[]参数)
{
如果(2!=参数长度)
{
Console.WriteLine(“用法:SetEdmxSqlVersion”);
返回;
}
字符串edmxFilename=args[0];
字符串ver=args[1];
XmlDocument xmlDoc=新的XmlDocument();
加载(edmxFilename);
XmlNamespaceManager mgr=新的XmlNamespaceManager(xmlDoc.NameTable);
管理器AddNamespace(“edmx”http://schemas.microsoft.com/ado/2008/10/edmx");
管理器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)
{
WriteLine(“找不到架构节点”);
}
其他的
{
WriteLine(“将文件{1}中的EDMX版本设置为{0}”,版本,edmxFilename);
node.Attributes[“ProviderManifestToken”]。值=版本;
xmlDoc.Save(edmxFilename);
}
}
}
}

使用上面@Vance的便捷控制台应用程序,我将以下内容用作BeforeBuild事件

<Target Name="BeforeBuild">
    <!--Check out BD.edmx, Another.edmx, all configs-->
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\DB.edmx" />
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\Another.edmx" />
    <!--Set to 2008 for Dev-->
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <!--Set to 2005 for Deployments-->
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
  </Target>

这非常方便,可以避免烦人的重新部署。感谢分享万斯。

我已经将TF.exe添加到Library solution文件夹中,这很有帮助,因为我现在可以在尝试编辑edmx文件之前签出它们,作为构建的一部分。此外,我还添加了一些条件,以便将服务器部署设置为2005年,将Dev machine sln配置设置为2008年。此外,您还需要将实际的SetEdmxSqlVersion.exe(和.pdb)文件添加到库文件夹(或您希望保留这些位的任何其他位置)


非常感谢万斯。非常简洁、节省大量时间,并使我的构建完全自动化且无痛苦:)

对于遇到相同问题但正在使用代码优先的用户,请查看如何在“代码优先”中更改ProviderManifestToken。它涉及到手动创建一个
DbModelBuilder
,并在调用模型生成器的
Build
方法时传递一个
DbProviderInfo
实例(带有适当的标记)。

在2012年和2008年也有类似的问题。它可以通过使用XmlPeek和XmlPoke的BeforeBuild事件解决:



如果您不喜欢自动替换,您可以简单地用错误任务替换XmlPoke任务。

我们在SQL2005 v.3上有此错误,而在SQL2005 v.4上没有此错误

将SQL2005添加到连接字符串修复了我们的特定问题


我们还没有确定原因,也不想修改代码以提供上述解决的令牌(部署过程中出现的问题)。

我错误地否决了这个,取消了那个,但现在不能做我真正想做的事情,那就是投票支持它!感谢您找到问题所在。如果我理解正确,是否由于从数据库(其中数据库是SQL 2008 DB)更新模型,该值从2005年更改为2008年?在我的环境中,我的开发人员机器有SQL 2008,但测试环境有2005(生产环境也有)。在我们迁移到2008年之前,我是否正确地假设这种情况将继续发生?我通常将其设置为2005年,即生产数据库;我用2008来发展。2008是向后兼容的,所以没有问题。此外,在更新/生成后,还需要将其更改回。在经历了痛苦的经历后,我总是在检查EDMX时验证这一点。这个修复对我不起作用??如果在LightSwitch中发生这种情况,请参阅我的博客文章,其中解释了如何在lsml文件中修复它(因为在LS中无法直接访问edmx文件):这是唯一的解决方案,但您应该知道,每次修改edmx时都需要这样做,因为它将恢复itself@Vance非常感谢,太好了。有点慢,因为我有三个edmx文件需要更改,所以可能会添加一个解决方案配置,以便在部署后恢复,并将其从常规构建中删除。现在将发布一个答案,其中包含在预构建(或后构建)中使用此便捷工具的信息