Entity Framework 4.1 Le modèle de sauvegarde le contexte a changé depuis la base de données a été créé, immédiatement après la création de DB
Je suis en train de travailler sur un projet qui utilise Entity Framework 4.1 pour la persistance de nos différents objets de la base de données (premier code).
Je suis en train de tester dans Visual Studio, avec un local SQL Express DB, et notre serveur Jenkins déploie commis code d'un serveur de test. Quand cela arrive, je change temporairement de mon local de la chaîne de connexion pour pointer vers le test de serveur de base de données et d'exécuter un test de l'unité de re-créer la base de données de test afin qu'il corresponde à nos dernières entités, etc.
J'ai récemment remarqué que notre serveur de test donne cette erreur:
Le modèle de la sauvegarde de la " EntityFrameworkUnitOfWork contexte a changé depuis la base de données a été créé. Soit manuellement supprimer/mettre à jour la base de données, ou l'appel de la Base de données.SetInitializer avec un IDatabaseInitializer instance. Par exemple, le DropCreateDatabaseIfModelChanges stratégie sera automatiquement supprimer et recréer la base de données, et éventuellement de graines avec de nouvelles données.
C'est généralement une indication que notre code a changé et j'ai besoin d'exécuter le test de l'unité de re-créer la base de données. Sauf que je viens de faire ça! Je ne crois pas qu'il existe quelque chose de mal avec notre processus de déploiement de la Dll sur le serveur de test semblent être les mêmes versions que dans mon environnement local. Existe-il d'autres paramètres ou facteurs de l'environnement qui peut provoquer cette erreur sur le modèle ayant changé depuis la base de données a été créé?
Je suis nouveau ici - merci pour toute aide!
- Pourriez-vous utiliser la méthode
System.Data.Entity.Infrastructure.EdmMetadata.TryGetModelHash(YourDbContext)
pour obtenir le ModelHash et essayer sur votre PC local et le testserver pour voir si elles sont différentes? - Avez-vous d'exécuter l'outil personnalisé afin de régénérer le contexte ou POCO après avoir régénéré base de données ?
- Oui les hachages ne semblent être différents.
- Pas sûr à 100% ce que tu veux dire. J'ai utilisé la Base de données.SetInitializer avec DropCreateDatabaseAlways DBContext pour régénérer la DB. Je suppose que ce serait POCO?
Vous devez vous connecter pour publier un commentaire.
L'erreur que vous voyez signifie que le modèle hash stocké dans
EdmMetadata
tableau est différent du modèle de hachage calculée à partir du modèle de l'application. Parce que vous êtes l'exécution de création de base de données à partir d'une autre application (votre dev. demande) il est possible que les deux diffèrent. Des conseils simples, ici, est: ne pas utiliser les différentes applications de base de données création et au lieu de laisser votre application principale de créer la base de données (soit automatiquement, soit par exemple avec certains de l'interface d'administration).Une autre option que vous devriez être en mesure de désactiver cette case complètement en retrait de la convention chargée de ces contrôles:
Modèle de calcul de hachage dépend de courant entités dans votre application (tout simple changement conséquent dans les différents modèle de hachage) et sur le serveur de base de données versions /manifeste. Par exemple, un modèle déployé sur SQL server 2005 et 2008 ont différents modèle de hachage (Express vs Plein ou 2008 /2008 R2 ne devrait pas entraîner dans les différents modèle de hachage).
EdmMetadata
de hachage, je suis heureux de simplement désactiver le hachage de la création/vérification par le retrait de la convention. Merci!Warning 2 'System.Data.Entity.Infrastructure.IncludeMetadataConvention' is obsolete: 'The IncludeMetadataConvention is no longer used. EdmMetadata is not included in the model. <see cref="EdmModelDiffer" /> is now used to detect changes in the model.'
2013 Réponse n'est plus pertinente dans EF4Cela peut se produire en raison de la réflexion de la commande de différences entre les différentes plates-formes. Pour vérifier, vous pouvez utiliser le EdmxWriter API pour comparer l'EDMX de deux environnements. Si l'une des tables différentes de la colonne de commande, puis c'est le problème.
De solution de contournement, vous pouvez modifier le mode de test de la base de données est mise à jour telle qu'elle est mise à jour à partir de votre serveur de test plutôt que de votre zone locale.
Nous allons résoudre ce problème dans la prochaine version.
Dans le code-première approche, le SSDL est produite lors de l'exécution du code. L'une des informations incluses dans le générés LSED est le nom du fournisseur utilisé dans le DbConnection. Comme vous l'avez dit, vous êtes connecté à différents moteurs de bases de données, alors vous devez utiliser deux fournisseurs différents. Ce completement change le résultat de la fonction de hachage.
Le code ci-dessous ont été extraites de la EntityFramework assemblée:
Cela peut l'aider et le lien vers Scott G blog, peut être une solution à votre problème cochez cette question lien
Edit 1: c'est le lien vers Scott G blog
Edit 2: Vous pouvez également vérifier cette si vous utilisez une première base de données sur le serveur d'intégration
Edit 3: C'est un réponse plus détaillée comme celui de Scott G
Sont les deux serveurs exécutant votre application fonctionnant sous différents systèmes d'exploitation (ou les service packs?) Il semble que le SHA256CryptoService utilisée pouvez jeter un PlatformNotSupportedException qui provoque à secours à une autre méthode.
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.sha256cryptoserviceprovider.aspx
Vous pouvez être en mesure de le tester en utilisant la réflexion d'invoquer les 2 suivants (interne/privé) des méthodes sur chaque serveur.
Entity Framework code first crée une table appelée EdmMetadata. Il maintient une table de hachage de votre modèle actuel. Une fois que vous exécutez l'application EF vérifie si le modèle utilisé est le même que le modèle de la db 'connaît'.
Si vous souhaitez effectuer une migration de base de données, je vous suggère d'utiliser EF Code premières migrations si c'est encore une alpha.
Si vous ne voulez pas utiliser les migrations, vous pouvez soit:
gérer le changement de schéma manuellement - à-dire de déplacer le contenu de la EdmMetadata table pour le serveur de test avec tous les changements
ou
ensemble de la db de l'initialiseur de DropCreateDatabaseIfModelChanges (ou mieux, quelque chose de dérivées et utiliser les Semences() la méthode pour écrire les données initiales). Pour définir la initialzer soit l'appel de la Base de données.SetInitializer() au démarrage de l'application ou de l'utilisation de la appSettings
J'ai seulement accidentellement renommé mon .fichier mdf et a obtenu cette erreur. Regardez donc aussi pour cela.