web-dev-qa-db-fra.com

Le modèle sauvegardant le contexte 'DataContext' a changé depuis la création de la base de données

J'essaie d'utiliser le code d'abord avec les migrations. Même s'il n'y a aucun changement en cours dans mon modèle, je reçois une exception. Lorsque j'ajoute une migration, les haut et bas sont vides, mais le message d'erreur suivant s'affiche: 

Une exception de type 'System.InvalidOperationException' s'est produite dans EntityFramework.dll mais n'a pas été traité dans le code utilisateur

Informations complémentaires: Modèle sauvegardant le contexte 'MyDataContext' a changé depuis la création de la base de données. Pensez à utiliser Code First Migrations pour mettre à jour la base de données ( http://go.Microsoft.com/fwlink/ ?

Mon architecture est la suivante:

  • Projet DataAccess incluant le contexte, les configurations fluides et le code de migration
  • Projet modèle contenant les classes poco
  • Les projets API Web et MVC contenant chacun la chaîne de connexion dans leurs fichiers web.config respectifs.

De plus, j'ai le code suivant:

DbInitializer

public static MyDataContext Create()
{
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataAccess.MyDataContext, MyDataAccess.Migrations.Configuration>());
   return new MyDataContext(ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString, null);
}

J'ai commencé avec AutomaticMigrationsEnabled = false; dans le constructeur de la configuration de la migration, car je croyais comprendre que cela me permettrait (et nécessiterait) de mieux contrôler le moment où les migrations étaient appliquées. J'ai également essayé de définir ceci sur true mais avec le même résultat.

J'ai ajouté une nouvelle migration à la réception de cette erreur et la méthode Up était vide. J'ai mis à jour la base de données pour cette nouvelle migration et un enregistrement a été créé dans la table _migrationHistory, mais l'erreur persiste quand je tente d'exécuter l'application. De plus, les données de départ n'ont pas été ajoutées à la base de données.

protected override void Seed(MyDataAccess.MyDataContext context)
{
            IdentityResult ir;

            var appDbContext = new ApplicationDbContext();
            var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(appDbContext));
            ir = roleManager.Create(new IdentityRole("Admin"));
            ir = roleManager.Create(new IdentityRole("Active"));
            ir = roleManager.Create(new IdentityRole("InActive"));

            var userNamager = new UserManager<User>(new UserStore<User>(appDbContext));

            //  assign default admin
            var admin = new User { UserName = "administrator", Email = "[email protected]" };
            ir = userNamager.Create(admin, "myp@55Word");

            ir = userNamager.AddToRole(admin.Id, "Admin");
 }

public class ApplicationDbContext : IdentityDbContext<User>
{
    public ApplicationDbContext()
        : base("MyDataContext", throwIfV1Schema: false)
    {
    }
    ...

La question: Si Add-Migration ne voit aucun changement dans le modèle, pourquoi cette erreur survient-elle lorsque j'exécute? Pourquoi le code de départ n'est-il pas touché? Comment puis-je résoudre ce problème, ou si cela ne peut pas être déterminé, comment puis-je déterminer la cause première?

11
Steve Wash

Cela a fonctionné pour moi.

Accédez à la console du gestionnaire de packages et exécutez - Update-Database -force

7
Kyle Johnson

Je ne sais pas si vous avez trouvé la réponse à votre problème, mais cette autre réponse que j'ai trouvée ici l'a réellement faite pour moi: Erreur de modification du modèle Entity Framework

En fait, j'ai fini par supprimer la table __MigrationHistory dans SQL Server dont je ne savais pas qu'elle était créée automatiquement.

L'article parle également de l'option de ne pas le générer, je pense en utilisant cette instruction: Database.SetInitializer<MyDbContext>(null); mais je ne l'ai pas utilisée, donc je ne suis pas sûr si cela fonctionne comme ça 

17
Oscar

Mon problème a fini par être un conflit entre l'activation de la migration automatique et l'initialiseur MigrateDatabaseToLatestVersion comme décrit ici .

0
Steve Greene

Je parie que votre contexte de données ne relie pas la chaîne de connexion . Vérifiez si elle n'est pas initialisée avec une localdb (quelque chose comme (localdb)\v11.0) et ne fonctionne pas avec cela quand vous pourriez penser qu'elle est définie sur autre chose.

0
George Polevoy