Question EF5 Code First - Modification d'un type de colonne avec des migrations


Je suis nouveau sur EF5 Code First et je bricole une preuve de concept avant de me lancer dans un projet au travail.

J'ai d'abord créé un modèle qui ressemblait à quelque chose comme

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public string Location {get;set;}
}

Et j'ai ajouté quelques enregistrements en utilisant une petite application MVC que j'ai collée sur le dessus.

Maintenant, je veux changer la colonne Emplacement en un enum, quelque chose comme:

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public Locations Location {get;set;}
}

public enum Locations {
  London = 1,
  Edinburgh = 2,
  Cardiff = 3
}

Lorsque j'ajoute la nouvelle migration, je reçois:

AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));

mais quand je lance update-database, je reçois une erreur

Conversion failed when converting the nvarchar value 'London' to data type int.

Existe-t-il un moyen dans la migration de tronquer la table avant d'exécuter l'instruction alter?

Je sais que je peux ouvrir la base de données et le faire manuellement, mais existe-t-il une méthode plus intelligente?


32
2018-02-12 16:28


origine


Réponses:


La manière la plus intelligente est probablement de ne pas modifier les types. Si vous devez le faire, je vous suggère de suivre les étapes suivantes:

  1. Ajouter une nouvelle colonne avec votre nouveau type
  2. Utilisation Sql() reprendre les données de la colonne d'origine en utilisant une déclaration de mise à jour
  3. Supprimer l'ancienne colonne
  4. Renommez la nouvelle colonne

Cela peut être fait dans la même migration, le script SQL correct sera créé. Vous pouvez ignorer l'étape 2 si vous souhaitez que vos données soient ignorées. Si vous voulez le reprendre, ajoutez l’instruction appropriée (peut également contenir une instruction switch).

Malheureusement, Code First Migrations ne fournit pas de moyens plus faciles pour y parvenir.

Voici le code exemple:

AddColumn("dbo.People", "LocationTmp", c => c.Int(nullable: false));
Sql(@"
    UPDATE dbp.People
    SET LocationTmp =
        CASE Location
            WHEN 'London' THEN 1
            WHEN 'Edinburgh' THEN 2
            WHEN 'Cardiff' THEN 3
            ELSE 0
        END
    ");
DropColumn("dbo.People", "Location");
RenameColumn("dbo.People", "LocationTmp", "Location");

48
2018-02-12 16:39



Basé sur @ JustAnotherUserYouMayKnow's answer, mais plus facile.

Essayez d'abord exécuter Sql() commande et ensuite AlterColumn():

Sql(@"
    UPDATE dbo.People
    SET Location =
        CASE Location
            WHEN 'London' THEN 1
            WHEN 'Edinburgh' THEN 2
            WHEN 'Cardiff' THEN 3
            ELSE 0
        END
    ");
AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));

14
2018-04-18 18:02