Utilisation de SQL Server 2008 et SQL Server 2005 et date et heure

J’ai construit un modèle de structure d’entité par rapport à une firebase database 2008. Tout fonctionne bien contre la firebase database 2008. Lorsque j’essaie de mettre à jour l’entité sur une firebase database 2005, j’obtiens cette erreur.

  La version de SQL Server utilisée ne prend pas en charge le type de données 'datetime2 

Je n’ai spécifiquement utilisé aucune fonctionnalité 2008 lorsque j’ai construit la firebase database. Je ne trouve aucune référence à datetime2 dans le code. Et oui, la colonne est définie comme “datetime” dans la firebase database.

Un rapide google me montre à quoi ressemble la solution .

Ouvrez votre EDMX dans un éditeur de fichiers (ou ouvrez avec… dans Visual Studio et sélectionnez XML Editor). En haut, vous trouverez le modèle de stockage et un atsortingbut ProviderManifestToken. Cela devrait avoir la valeur 2008. Changer cela à 2005, recomstackr et tout fonctionne.

REMARQUE: vous devrez le faire chaque fois que vous mettez à jour le modèle depuis la firebase database.

Vue rapide de la ligne:

 

C’est très frustrant et je suis surpris que MS ait décidé de ne pas le faire pour pouvoir cibler une version SQL donnée. Pour nous assurer que nous ciblons 2005, j’ai écrit une application console simple et l’appeler lors d’une étape PreBuild.

L’étape de pré-construction 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(ssortingng[] args) { if (2 != args.Length) { Console.WriteLine("usage: SetEdmxSqlVersion  "); return; } ssortingng edmxFilename = args[0]; ssortingng 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.Atsortingbutes["ProviderManifestToken"].Value = ver; xmlDoc.Save(edmxFilename); } } } } 

En utilisant l’application de console pratique de @Vance ci-dessus, j’ai utilisé ce qui suit en tant qu’événement BeforeBuild

                

C’est très pratique, car cela évite un redéploiement agaçant. Merci d’avoir partagé Vance.

J’ai ajouté TF.exe au dossier de la solution Library et cela m’aide, car je peux maintenant extraire les fichiers edmx avant d’essayer de les éditer, dans le cadre de la génération. J’ai également ajouté ceci à des conditions, de sorte qu’il soit fixé à 2005 pour les déploiements sur le serveur et à 2008 pour les configurations sln de la machine Dev. De même, vous devez append le ou les fichiers SetEdmxSqlVersion.exe (et .pdb) au dossier Library (ou à tout autre endroit où vous souhaitez conserver ces bits).

Merci beaucoup @Vance. Vraiment net, gain de temps massif et maintient mes builds totalement automatisés et sans douleur 🙂

Pour le bénéfice des personnes qui rencontrent le même problème mais qui utilisent Code First , consultez ma réponse ici pour savoir comment modifier le ProviderManifestToken dans Code First. Cela implique la création manuelle d’un DbModelBuilder et le passage d’une instance DbProviderInfo (avec le jeton approprié) lors de l’appel de la méthode Build du générateur de modèles.

Avait un problème similaire avec 2012 vs 2008. Il peut être résolu avec un événement BeforeBuild en utilisant XmlPeek et XmlPoke:

         

Si vous n’aimez pas le remplacement automatisé, vous pouvez simplement remplacer la tâche XmlPoke par une tâche d’erreur.

Une meilleure solution est de modifier manuellement le fichier EDMX en ouvrant simplement edmx en mode conception et dans le menu contextuel “Mettre à jour le modèle depuis la firebase database …”. Vous devez bien sûr pointer vers la bonne version de SQL quelle qu’elle soit pour vous.

Nous avons eu cette erreur sur SQL2005 v.3, où nous ne l’avions pas sur SQL2005 v.4.

L’ajout de SQL2005 à la chaîne de connexion a résolu notre problème spécifique.

Nous n’avons pas encore identifié la raison et n’avons pas voulu modifier le code pour fournir le jeton tel que résolu ci-dessus (problème manifesté lors du déploiement).