web-dev-qa-db-fra.com

Le modèle sauvegardant le contexte '--Context' a changé depuis la création de la base de données - mais db est une nouvelle base de données de production

J'ai cette erreur pour la 762e fois mais cette fois-ci, je la reçois dès que je tente d'accéder à mon site de production, immédiatement après la suppression de la base de données "de production" sur Azure, puis la publication de mon site.

The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database

J'ai supprimé la base de données parce que je ne pouvais pas résoudre ce problème autrement mais cela ne fonctionne toujours pas. 

Quelques points importants:

  • J'utilise EF6 et je publie sur Azure. 
  • C'est l'un des 2 projets/sites qui utilise le même projet Repo. je n'ai pas
    problèmes avec l'autre, juste celui-là. 
  • J'ai essayé de publier le projet problématique en premier (après avoir supprimé la base de données) et Second avec le même résultat. 
  • J'ai essayé de supprimer les sites Web et la base de données d'Azure et de recommencer
  • J'ai essayé de supprimer toutes les migrations et de commencer avec un nouveau modèle de données
  • J'ai essayé ce qui suit dans mon Global.asax (dans les deux projets)

    Database.SetInitializer PropertyContext> (null); <- SO ne me laissera pas mettre le premier <

et

Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);

J'utilise .net 4.5

Pourquoi cette erreur apparaît-elle sur une nouvelle base de données et comment puis-je faire fonctionner ce site?

24
stuartdotnet

Je viens de rencontrer la même erreur dans l'application ASP.Net. Dans mon cas, je n'ai pas utilisé Code First, mais j'ai utilisé un fournisseur d'authentification ASP.Net standard, qui utilise apparemment Code First, et l'authentification a été rompue à cause de ce problème.

Voici une solution simple et rapide si vous ne vous souciez pas des enregistrements d’utilisateurs existants:

Pour moi, la solution consistait à supprimer la table dbo.__MigrationHistory, l'authentification a ensuite bien fonctionné. Être conscient! Cette solution n'est pas pour tout le monde! Cela résoudra le problème, mais c'est potentiellement risqué. 

Si vous ne pouvez pas vous permettre de perdre des données dans les tableaux AspNet *:

Le fournisseur d'authentification ASP.Net crée automatiquement des tables dans votre base de données:

  • AspNetRoles
  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogings

Les tables sont vides par défaut, si vous n'avez pas créé de nouvelles connexions pour votre site Web, vous pouvez utiliser la solution "rapide et sale" ci-dessus. Si vous vous souciez de la préservation des informations utilisateur ou simplement de la curiosité du fonctionnement des migrations Code First, procédez comme suit:

  • Ouvrez votre fichier Web.config et vérifiez le nom de la chaîne de connexion que vous avez pour votre base de données. Ce sera l'un des enregistrements sous l'élément <connectionStrings>.
  • Ouvrez la console du gestionnaire de packages: 

    Outils -> Gestionnaire de packages de bibliothèque -> Console du gestionnaire de packages

  • Dans la fenêtre Package Manager Console, utilisez un menu déroulant pour définir le projet par défaut. Assurez-vous qu'il s'agit du projet contenant le code du fournisseur d'authentification ASP.Net.
  • Exécuter la commande:
    Update-Database -ConnectionStringName MyConnectionStringName

Remplacez MyConnectionStringName par le nom que vous avez recherché dans web.config.

À la suite de cette commande, vous verrez un nouveau dossier "Migrations" avec un tas de code généré par la commande Update-Database. Si vous reconstruisez et redéployez votre application, votre nouveau code de migration sera exécuté au démarrage et synchronisera le schéma de base de données avec une version mise à jour du code du fournisseur d'authentification ASP.Net.

35
seva titov

Lorsque vous utilisez Code First avec Migrations, votre base de données crée une table appelée __MigrationHistory pour suivre le schéma actuel. Lorsque vous exécutez votre application, Entity Framework vérifie cette table pour s'assurer que le schéma de base de données correspond à vos entités de base de données. S'ils ne correspondent pas, vous obtiendrez cette erreur.

Pour mettre à jour votre base de données, procédez comme suit:

  1. Ouvrez la console du gestionnaire de packages (Affichage -> Autres fenêtres -> Console du gestionnaire de packages) dans Visual Studio.
  2. Dans la fenêtre de la console de gestion des packages, vos projets se trouvent dans une liste déroulante. Assurez-vous qu’il est défini sur le projet contenant votre DbContext.
  3. Assurez-vous que le projet contenant votre fichier App.ConfigWeb.Config est "Définir comme projet de démarrage" (si vous avez plusieurs configurations, il doit s'agir de celui avec la chaîne de connexion de base de données définie.
  4. Tapez Update-Database -ConnectionStringName MyConnStringMyConnString est le _/nom (pas la chaîne de connexion réelle) de votre chaîne de connexion dans votre App.Config/Web.Config

Si vous obtenez une erreur comme celle-ci: "Impossible de mettre à jour la base de données pour correspondre au modèle actuel car des modifications sont en attente et que la migration automatique est désactivée."

Vous devez activer les migrations automatiques et réessayer . Pour activer les migrations automatiques

  1. Dans le dossier Migrations (dans le projet avec votre DbContext), ouvrez Configuration.cs.
  2. Assurez-vous que le constructeur contient: AutomaticMigrationsEnabled = true;

Pour empêcher Entity Framework/DbContext de surveiller les modifications de votre base de données, vous pouvez simplement supprimer la table __MigrationHistory de votre base de données. Il vous appartient ensuite de vous assurer que la base de données reste mise à jour manuellement.

Article MSDN ici

27
Talon

La solution consiste à utiliser la méthode statique SetInitializer et à associer au contexte une valeur Null. Si vous travaillez sur une solution Web, la meilleure position pour écrire le code est dans le champ Application_Start de votre fichier Global.asax.cs.

protected void Application_Start() 
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    //...
    Database.SetInitializer<MyContext>(null);
}
7
Mhadonis

J'ai un problème similaire ce matin. Soudain, l'erreur est apparue et n'a pas pu être résolue:

The model backing the 'ApplicationDbContext' context has changed since 
the database was created. Consider using Code First Migrations to update 
the database

J'ai un projet pour MVC et un autre projet pour le modèle, le contexte et les référentiels. J'y travaille depuis des semaines mais aujourd'hui, on m'a dit d'arrêter.

J'ai essayé de supprimer la base de données, enable-migration, add-migration et update-database tellement de fois que j'ai perdu le compte. J'ai ajouté des initialiseurs à MigrateDatabaseToLatestVersion et à DropCreateDatabaseIfModelChanges. Tout en vain ...

Ce qui a finalement fait que cela fonctionne était de déplacer le modèle, le contexte et les référentiels dans le projet MVC (pas quelque chose qui me tenait à cœur) ... puis tout fonctionnait immédiatement, sans aucune modification de code (à part les espaces de noms) ! Très étrange...

Au cours de la journée, j'ai lu beaucoup d'articles de blog pour tenter de résoudre ce problème. L'un d'eux (je ne sais pas lequel) a mentionné un bogue dans Visual Studio 2013, dans lequel la référence aux fichiers DLL n'était pas toujours mise à jour correctement, suggérant que mon projet MVC avait oublié quelque chose lorsque j'exécutais add. -migration et update-database dans mon projet séparé. Mais c'est juste une supposition.

J'utilise EF 6.1 et .Net 4.5.1 dans ma solution.

3
Ohlin

Vous avez un problème similaire! La réponse est ici http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc3/cs/adding-a-new-field

(Rick Anderson) Il existe deux approches pour résoudre l'erreur:

  1. Demandez à Entity Framework de supprimer et de recréer automatiquement la base de données en fonction du nouveau schéma de classe de modèle. Cette approche est très pratique lorsque vous effectuez un développement actif sur une base de données de test, car elle vous permet de faire évoluer rapidement le modèle et le schéma de base de données. L'inconvénient, cependant, est que vous perdez des données existantes dans la base de données - vous ne voulez donc pas utiliser cette approche sur une base de données de production! 

  2. Modifiez explicitement le schéma de la base de données existante afin qu'il corresponde aux classes du modèle. L'avantage de cette approche est que vous conservez vos données. Vous pouvez effectuer cette modification manuellement ou en créant un script de modification de base de données.

1
saka saka

J'ai passé des heures à essayer de résoudre ce problème. Un projet fonctionnait, l'autre non.

J'ai eu différents projets faisant référence à différentes versions de Entity Framework. Dans mon cas, j'avais un Console app et un Windows Service app, faisant tous deux référence à un troisième projet contenant le code first classes et DbContext.

Après avoir exécuté Update-Package EntityFramework, tout a bien fonctionné dans les deux projets.

0
Alisson