Usando o SQL Server 2008 e SQL Server 2005 de tempo e data

votos
117

Eu construí um modelo de estrutura de entidade contra um banco de dados de 2008. Tudo funciona ok no banco de dados de 2008. Quando eu tento atualizar a entidade em um banco de dados de 2005 eu recebo este erro.

A versão do SQL Server em uso não suporta tipo de dados datetime2'

Eu especificamente não utilizar qualquer recurso de 2008, quando eu construí o banco de dados. Não consigo encontrar qualquer referência a datetime2 no código. E, sim, a coluna é definida como data e hora no banco de dados.

Publicado 25/11/2008 em 06:15
fonte usuário
Em outras línguas...                            


8 respostas

votos
191

Um rápido google me aponta para o que parece ser a solução .

Abra seu EDMX em um editor de arquivo (ou “Abrir com ...” no Visual Studio e selecione Editor XML). No topo encontra-se o modelo de armazenamento e tem um atributo ProviderManifestToken. Isto tem deve ter o valor de 2008. Mudança que a 2005, recompilar e tudo funciona.

NOTA: Você vai ter que fazer isso toda vez que você atualizar o modelo de banco de dados.

Respondeu 25/11/2008 em 07:31
fonte usuário

votos
12

A visualização rápida de linha:

<Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >
Respondeu 06/02/2010 em 00:46
fonte usuário

votos
1

Melhor solução para mim é em vez de editar manualmente o arquivo EDMX é apenas edmx aberto no modo de design e no menu de contexto "Modelo de atualização do banco de dados ...". Você tem que estar apontando para a versão SQL certo, claro que quer que isso é para você.

Respondeu 30/03/2011 em 12:29
fonte usuário

votos
11

Isso é muito frustrante e eu estou surpreso MS decidiu não fazê-lo assim que você poderia ter como alvo uma determinada versão SQL. Para se certificar de que nós estamos alvejando 2005 eu escrevi um aplicativo de console simples e chamá-lo em uma etapa PreBuild.

O passo prebuild parece com isso:

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

O código é aqui:

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);
            }
        }
    }
}
Respondeu 06/01/2012 em 21:55
fonte usuário

votos
4

Usando @ prático console app de Vance acima, eu usei o seguinte como um evento 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>

Isso é super acessível, como evita reafectação irritante. Obrigado por compartilhar Vance.

Eu adicionei tf.exe para a pasta solução Biblioteca e isso ajuda, como eu agora pode verificar os arquivos EDMX antes de tentar editá-los, como parte da compilação. Também eu adicionei isso com condições, para que ele define a 2005 para implantações para o servidor e de volta a 2008 para as configurações SLN máquina Dev. Também mencionar que você precisa adicionar o SetEdmxSqlVersion.exe real (e .pdb) arquivo (s) para a pasta Library (ou onde mais você quiser manter esses bits).

Muito obrigado @Vance. Realmente limpo, enorme poupança de tempo e mantém minha constrói :) sem dor totalmente automatizado e

Respondeu 28/03/2012 em 21:07
fonte usuário

votos
2

Para o benefício de pessoas que se deparam com o mesmo problema, mas estão usando o Code First , veja a minha resposta aqui sobre como alterar o ProviderManifestTokenno Code First. Trata-se de criar um DbModelBuildermanualmente e passar um DbProviderInfoexemplo (com o símbolo apropriado) ao chamar o construtor modelo de Buildmétodo.

Respondeu 21/08/2012 em 19:22
fonte usuário

votos
1

Tive um problema semelhante com 2012 vs. 2008. Ele pode ser resolvido com um evento BeforeBuild usando XmlPeek e XmlPoke:

   <Target Name="BeforeBuild">
      <XmlPeek XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken">
         <Output TaskParameter="Result" ItemName="TargetedSQLVersion" />
      </XmlPeek>

      <XmlPoke Condition="@(TargetedSQLVersion) != 2008"
               XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken"
               Value="2008">
      </XmlPoke>
   </Target>

Se você não gosta de substituição automatizado, você pode simplesmente substituir a tarefa XmlPoke com uma tarefa de erro.

Respondeu 08/03/2016 em 12:10
fonte usuário

votos
0

Tivemos esse erro em v.3 SQL2005, onde nós não tê-lo em v.4 SQL2005.

Adicionando SQL2005 para a seqüência de conexão fixa o nosso problema específico.

Não identificamos por isso ainda, e não queria modificar o código para fornecer o token como resolvido acima (problema que se manifesta durante a implantação).

Respondeu 05/02/2018 em 18:12
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more