web-dev-qa-db-fra.com

Le modèle sauvegardant un contexte de base de données a changé; Considérez Code First Migrations

Le modèle sauvegardant le contexte 'MyDbContext' a changé depuis la création de la base de données. Envisagez d'utiliser Code First Migrations pour mettre à jour la base de données ( http://go.Microsoft.com/fwlink/?LinkId=238269 ).

Qu'est-ce qui cause cela? Je viens littéralement de créer une toute nouvelle base de données et je n'ai rien changé, mais chaque fois que j'essaie d'accéder à un modèle à partir d'un contrôleur, cela renvoie ceci. 

Modifier

Cela a quelque chose à voir avec le fait que je tentais de partager une chaîne de connexion (c'est-à-dire une base de données) avec deux entités distinctes.

40
Brian D

EF codefirst examinera votre DbContext et découvrira toutes les collections d'entités qui y sont déclarées (et examinera également les entités associées à ces entités via les propriétés de navigation). Il examinera ensuite la chaîne de connexion à laquelle vous lui avez attribué une chaîne de connexion et s'assurera que toutes les tables y correspondent à la structure de vos entités dans le modèle. S'ils ne correspondent pas, il ne peut pas lire/écrire dans ces tables. Chaque fois que vous créez une nouvelle base de données ou si vous modifiez quelque chose à propos des déclarations de classe d'entité, telles que l'ajout de propriétés ou la modification de types de données, le modèle détectera que le modèle et la base de données ne sont pas synchronisés. Par défaut, cela vous donnera simplement l'erreur ci-dessus. Généralement, pendant le développement, vous souhaitez que la base de données soit recréée (effacement de toutes les données) et générée à nouveau à partir de votre nouvelle structure de modèle.

Pour ce faire, voir "Fonction RecreateDatabaseIfModelChanges" dans cet article: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework- 4.aspx

Vous devez en principe fournir un initialiseur de base de données qui hérite de DropCreateDatabaseIfModelChanges (RecreateDatabaseIfModelChanges est maintenant obsolète). Pour ce faire, ajoutez simplement cette ligne à la méthode Application_Start de votre fichier Global.asax.

Database.SetInitializer<NameOfDbContext>(new DropCreateDatabaseIfModelChanges<NameOfDbContext>());

Une fois que vous êtes en production et que vous ne souhaitez plus perdre de données, supprimez cet initialiseur et utilisez plutôt la migration de base de données pour pouvoir déployer les modifications sans perdre de données. 

35
AaronLS

Dans mon cas, cette erreur était due à l'existence de la table _MigrationsHistory dans la base de données. La suppression de cette table a résolu le problème. Vous ne savez pas comment cette table est entrée dans notre base de données d'environnement de test.

29
Craig Fisher

Pour résoudre cette erreur, écrivez le code suivant dans la méthode Application_Start () du fichier Global.asax.cs.

Database.SetInitializer<MyDbContext>(null);
28
Sid

Si vous avez modifié votre contexte et que vous souhaitez apporter manuellement des modifications pertinentes à la base de données (ou le laisser tel quel), il existe une méthode rapide et incorrecte.

Accédez à la base de données et supprimez tous les éléments de la table "_MigrationHistory".

6
Illidan

Méthode la plus simple et la plus sûre .__ Si vous savez que vous souhaitez réellement modifier/mettre à jour votre structure de données afin que la base de données puisse se synchroniser avec votre DBContext, le moyen le plus sûr consiste à:

  1. Ouvrez votre console du gestionnaire de paquets
  2. Type: update-database -verbose -force

Cela indique à EF d’apporter des modifications à votre base de données afin qu’elle corresponde à la structure de vos données DBContext.

5
Photonic

Si vous avez modifié le modèle et la base de données avec des tables existantes et que le message "Le modèle sauvegardant un contexte de base de données a été modifié; envisagez la migration de code d'abord", vous devez:

  • Supprimez les fichiers du dossier "Migration" de votre projet.
  • Ouvrez la console du gestionnaire de packages et exécutez pm>update-database -Verbose
1
Ranjan

Entity Framework détecte que quelque chose à propos du modèle a changé, vous devez faire quelque chose à la base de données pour obtenir ce travail. Solution: 1 . enable-migrations 2 . mise à jour-base de données

1

Cela se produit lorsque votre structure de table et votre classe de modèle ne sont plus synchronisées . Vous devez mettre à jour la structure de la table en fonction de la classe de modèle ou inversement - c'est lorsque vos données sont importantes et ne doivent pas être supprimées. Si votre structure de données a changé et que les données ne sont pas importantes pour vous, vous pouvez utiliser la fonctionnalité DropCreateDatabaseIfModelChanges (anciennement appelée 'RecreateDatabaseIfModelChanges') en ajoutant le code suivant dans votre Global.asax.cs :

Database.SetInitializer<MyDbContext>(new DropCreateDatabaseIfModelChanges<MyDbContext>());

Exécutez votre application à nouveau. 

Comme son nom l'indique, votre base de données sera supprimée et recréée en fonction de votre dernière classe de modèle (ou classes) - à condition que vous pensiez que les définitions de structure de table de vos classes de modèle sont les plus récentes et les plus récentes; sinon changez les définitions de propriétés de vos classes de modèle.

1
Antonio Ooi

Tu as besoin de me croire. J'ai cette erreur pour la simple raison que j'ai oublié d'ajouter la chaîne de connexion à l'App.Config (le mien est un projet wpf) de votre projet de démarrage.

La config entière dans mon cas 

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="ZzaDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ZaaDbInDepth;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
0
VivekDev

Ajouter ceci comme une autre solution possible, parce que c'est ce qui l'a corrigé dans notre cas;

Assurez-vous, si vous avez plusieurs projets, qu'ils utilisent la même version du package Entity Framework Nuget !. 

Dans notre cas, nous avions un projet (appelez si projet A) contenant le premier contexte de code EF avec toutes les entités. C’était ce projet que nous utilisions pour ajouter des migrations et mettre à jour la base de données . Cependant, un deuxième projet (B) faisait référence au projet A pour utiliser le contexte. Lors de l'exécution de ce projet, nous avons eu la même erreur.

Le modèle sauvegardant le contexte 'MyDbContext' a changé depuis la création de la base de données. Envisagez d'utiliser Code First Migrations pour mettre à jour la base de données ( http://go.Microsoft.com/fwlink/?LinkId=238269 ) .

0
Yan

Cette erreur se produit lorsque la base de données n'est pas synchronisée avec votre modèle et inversement. Pour surmonter cela, suivez les étapes ci-dessous -

a) Ajoutez un fichier de migration en utilisant  add-migration <{Nom du fichier de migration}>  à travers le Console du gestionnaire de paquets Nuget. Ce fichier de migration aura le script pour synchroniser tout ce qui n'est pas synchronisé entre Db et le code. 

b) Mettez à jour la base de données en utilisant  mise à jour-base de données  commander. Cela mettra à jour le fichier base de données avec les dernières modifications apportées à votre modèle. 

Si cela ne vous aide pas, essayez ces étapes après avoir ajouté la ligne de code dans la méthode Application_Start du fichier Global.asax.cs -

Database.SetInitializer<VidlyDbContext>(new DropCreateDatabaseIfModelChanges<VidlyDbContext>());

Référence - http://robertgreiner.com/2012/05/unable-to-update-database-to-match-the-current-model-pending-changes/

0
SunilA