Using SQL Server 2008 and SQL Server 2005 and date time

前端 未结 8 2178
春和景丽
春和景丽 2020-12-12 12:52

I\'ve built a entity framework model against a 2008 database. All works ok against the 2008 database. When I try to update the entity on a 2005 database I get this error.

相关标签:
8条回答
  • 2020-12-12 13:13

    We had this error on SQL2005 v.3, where we did not have it on SQL2005 v.4.

    Adding SQL2005 to the connection string fixed our specific problem.

    We haven't identified why yet, and did not want to modify code to provide the token as solved above (issue manifested during deployment).

    0 讨论(0)
  • 2020-12-12 13:16

    This is very frustrating and I am surprised MS decided not to make it so you could target a given SQL version. To make sure we are targeting 2005 I wrote a simple console app and call it in a PreBuild step.

    The prebuild step looks like this:

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

    The code is here:

    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);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-12 13:20

    Quick view of line:

    <Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >
    
    0 讨论(0)
  • 2020-12-12 13:20

    Using @Vance's handy console app above, I used the following as a BeforeBuild event

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

    This is super handy, as avoids annoying redeployment. Thanks for sharing Vance.

    I've added TF.exe to the Library solution folder and this helps, as I can now check out the edmx files before trying to edit them, as part of the build. Also I have added this with conditions, so that it sets to 2005 for deployments to the server and back to 2008 for the Dev machine sln configurations. Also to mention you need to add the actual SetEdmxSqlVersion.exe (and .pdb) file(s) to the Library folder (or wherever else you want to keep these bits).

    Thanks very much @Vance. Really neat, massive time saver and keeps my builds totally automated and pain free :)

    0 讨论(0)
  • 2020-12-12 13:26

    For the benefit of people who encounter the same issue but are using Code First, check out my answer here about how to change the ProviderManifestToken in Code First. It involves creating a DbModelBuilder manually and passing a DbProviderInfo instance (with the appropriate token) when calling the model builder's Build method.

    0 讨论(0)
  • 2020-12-12 13:28

    A quick google points me to what looks like the solution.

    Open your EDMX in a file editor (or “open with…” in Visual Studio and select XML Editor). At the top you will find the storage model and it has an attribute ProviderManifestToken. This has should have the value 2008. Change that to 2005, recompile and everything works.

    NOTE: You'll have to do this every time you update the model from database.

    0 讨论(0)
提交回复
热议问题