118 votes

À l'aide de SQL Server 2008 et SQL Server 2005 et la date de temps

J'ai construit un modèle d'entity framework contre un 2008 de la base de données. Tout fonctionne bien à l'encontre de la 2008 de la base de données. Lorsque j'essaie de mettre à jour l'entité sur une 2005 de la base de données, j'obtiens cette erreur.

La version de SQL Server est en cours d'utilisation ne prend pas en charge le type de données 'datetime2

J'ai expressément de ne pas utiliser n'importe 2008 caractéristiques quand j'ai construit la base de données. Je ne trouve pas de référence à datetime2 dans le code. Et, oui, la colonne est définie comme "datetime" dans la base de données.

189voto

Richard Harrison Points 14891

Un rapide google points-moi à quoi ressemble la solution.

Ouvrez votre EDMX dans un éditeur de fichier (ou "ouvrir avec..." dans Visual Studio et sélectionnez Éditeur XML). En haut, vous trouverez le modèle de stockage et il a un attribut ProviderManifestToken. Cela a doit avoir la valeur de 2008. Changement à 2005, le recompiler et tout fonctionne.

REMARQUE: Vous aurez à le faire à chaque fois que vous mettez à jour le modèle de base de données.

11voto

Jason Points 1839

Vue rapide de la ligne:

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

10voto

Vance Kessler Points 111

C'est très frustrant et je suis surpris de MS a décidé de ne pas faire de sorte que vous pouvez cibler une version SQL. Assurez-vous que nous ciblons 2005, j'ai écrit une application console simple et de l'appeler dans un Paquetage étape.

Le paquetage étape ressemble à ceci:

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

Le code est ici:

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);
            }
        }
    }
}

3voto

MemeDeveloper Points 1513

À l'aide de @Vance pratique de l'application de console ci-dessus, j'ai utilisé les éléments suivants comme BeforeBuild événement

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

C'est super pratique, évite ennuyeux redéploiement. Merci pour le partage de Vance.

J'ai ajouté TF.exe à la Bibliothèque de la solution de dossier et cette aide, que je peux maintenant vérifier l'edmx fichiers avant de tenter de les modifier, dans le cadre de la construction. J'ai aussi ajouté ceci avec des conditions, de sorte qu'il établit à 2005 pour les déploiements sur le serveur et de 2008 pour le Dev de la machine de la sln configurations. À mentionner également que vous devez ajouter les SetEdmxSqlVersion.exe (et .apb) fichier(s) vers le dossier Bibliothèque (ou n'importe où ailleurs vous voulez garder ces bits).

Merci beaucoup @Vance. Vraiment génial, énorme gain de temps et garde mes construit entièrement automatisée et sans douleur :)

1voto

sinelaw Points 6641

Pour le bénéfice des personnes qui rencontrent le même problème mais à l'aide de Code de la Première, découvrez ma réponse ici sur la façon de modifier l' ProviderManifestToken dans le Premier Code. Il s'agit de créer un DbModelBuilder manuellement et en passant un DbProviderInfo exemple (avec le jeton) lors de l'appel du modèle du constructeur Build méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X