web-dev-qa-db-fra.com

Code First Migration - Entity Framework - impossible d'ajouter une colonne à la table

Cette question a été posée plusieurs fois dans différentes versions sur SO. J'ai parcouru toutes les réponses et brûlé beaucoup de temps. Je n'arrive pas à faire fonctionner cela.

Je travaille sur asp.net mvc Entity Framework, application serveur SQL. J'ai déjà une base de données, des tables, etc. existantes et tout fonctionne. J'ai juste besoin d'ajouter une nouvelle colonne au tableau.

Alors .. J'ai ajouté une propriété dans la classe de modèle, afin de pouvoir ajouter la colonne à la table. Mais sans succès.

Je fais donc les étapes dans l'ordre suivant.

  1. Ajoutez le champ dans ma classe de modèle.

    [Required]
    public string EmailSubject{ get; set; }
    
  2. Ensuite, je supprime le dossier Migrations dans mon projet mvc asp.net contenant la classe Configuration.cs
  3. Ensuite, dans Package Manager Console, j'émets la commande suivante avec succès.

    Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
    
  4. Ensuite, j'ai défini la propriété true comme suit

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
    
  5. Ensuite, j'émets la commande suivante dans la console du gestionnaire de packages.

    Update-Database -Verbose -Force
    

Voici à quoi ressemble ma chaîne de connexion à la connexion par défaut à la base de données

Data Source=(LocalDb)\v11.0;AttachDbFilename=C:\practice\AppointmentReminder4\AppointmentReminder4\App_Data\aspnet-AppointmentReminder4-20141202060615.mdf;Initial Catalog=aspnet-AppointmentReminder4-20141202060615;Integrated Security=True

Mais je ne suis PAS en mesure d'ajouter la nouvelle colonne dans ma table souhaitée.


Modifier 1

J'ai mis à jour le modèle comme suit sans l'attribut requis et exécuté toutes les étapes ci-dessus mais je n'ai toujours pas pu ajouter la colonne à la table.

public string EmailBody { get; set; }

Voici toutes les commandes et leur sortie.

PM> Enable-Migrations -ContextTypeName AppointmentReminder.Data.ReminderDb -Force
Checking if the context targets an existing database...
Code First Migrations enabled for project AppointmentReminder4.
PM> Update-Database -Verbose -Force
Using StartUp project 'AppointmentReminder4'.
Using NuGet project 'AppointmentReminder4'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Running Seed method.
PM> Update-Database -Verbose -Force
Using StartUp project 'AppointmentReminder4'.
Using NuGet project 'AppointmentReminder4'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'aspnet-AppointmentReminder4-20141202060615' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Running Seed method.
PM> 

Edit 2 Enfin résolu ce problème. Toutes mes étapes ci-dessus étaient correctes. Sauf que je modifiais ma classe de modèle par opposition à la classe de données réelle qui est en fait liée à ReminderDb (objet EF). Après avoir mis à jour la classe correcte avec la propriété, tout a fonctionné avec succès. Merci à tous ceux qui ont répondu avec aide!

15
dotnet-practitioner

Étant donné que le champ est obligatoire, vous devez spécifier une valeur par défaut. Modifiez votre fichier de migration, recherchez la ligne ajoutant votre colonne et spécifiez la valeur par défaut:

public override void Up()
{    
    AddColumn("dbo.MyTable", "EmailSubject", c => c.String(nullable: false, defaultValue: ""));
}

Pour référence: valeur par défaut pour les champs obligatoires dans les migrations Entity Framework?

Modifier: En fonction de votre modification, vous devez créer une migration avant d'essayer de mettre à jour. Voir cet exemple pour savoir comment vous l'utilisez généralement.

Cependant, si vous essayez d'appliquer des migrations Code First à une base de données existante, cet article peut vous aider: Migrations Code First avec une base de données existante

15
Will Eddins

Vous avez décoré la nouvelle colonne avec l'attribut requis. Si cette table a déjà quelques lignes, ces lignes ne peuvent pas avoir cette colonne. Supprimer requis. Que pour les migrations, remplissez toutes les lignes avec des données. Rendre la propriété requise et migrer à nouveau.

6
tmg