Comment renommer une colonne de firebase database dans Entity Framework 5 Code Premières migrations sans perte de données?

J’ai réussi à exécuter le modèle ASP.NET MVC 4 par défaut avec EF 5.0 Code First Migrations. Toutefois, lorsque je mets à jour un nom de propriété de modèle, les données de colonne de table correspondantes sont supprimées par EF 5.0.

Est-il possible de renommer la colonne de la table sans supprimer les données de manière automatisée?

    Modifiez manuellement les méthodes Up et Down de la migration pour utiliser la méthode RenameColumn pour remplacer AddColumn et DropColumn générées automatiquement pour vous.

    Comme déjà dit , remplacez AddColumn et DropColumn qui est généré automatiquement avec RenameColumn .

    Exemple:

     namespace MyProject.Model.Migrations { using System; using System.Data.Entity.Migrations; public partial class RenameMyColumn : DbMigration { public override void Up() { // Remove the following auto-generated lines AddColumn("dbo.MyTable", "NewColumn", c => c.Ssortingng(nullable: false, maxLength: 50)); DropColumn("dbo.MyTable", "OldColumn"); // Add this line RenameColumn("dbo.MyTable", "OldColumn", "NewColumn"); } public override void Down() { // Remove the following auto-generated lines AddColumn("dbo.MyTable", "OldColumn", c => c.Ssortingng(nullable: false, maxLength: 50)); DropColumn("dbo.MyTable", "NewColumn"); // Add this line RenameColumn("dbo.MyTable", "NewColumn", "OldColumn"); } } } 

    Maintenant, cette réponse est basée sur ma connaissance de EF4.3, alors j’espère que les migrations fonctionnent à peu près de la même manière dans EF5 🙂 Après avoir créé une migration, vous devriez pouvoir append du code dans les méthodes Up et Down, entre l’abandon de l’ancienne propriété et la création de la nouvelle propriété. Ce code doit déplacer les données de propriété dans la bonne direction. Je l’ai résolu avec la méthode SQL () où vous pouvez entrer du SQL brut pour effectuer le transfert de données.

    Dans la méthode Up de la migration:

     SQL("update [TheTable] set [NewColumn] = [OldColumn]"); 

    et dans la méthode Down ():

     SQL("update [TheTable] set [OldColumn] = [NewColumn]"); 

    L’inconvénient de cette approche est que vous pouvez coupler votre code avec la firebase database avec laquelle vous travaillez actuellement (puisque vous écrivez du code SQL spécifique à la firebase database). Il pourrait y avoir d’autres méthodes disponibles pour le transfert de données.

    Plus d’infos disponibles ici: MSDN

    Vous pouvez obtenir la migration pour appeler RenameColumn si vous faites cela:

     [Column("NewName")] public ssortingng OldName { get; set; } 

    Voici la migration générée:

      public override void Up() { RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName"); } public override void Down() { RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName"); } 

    Si vous souhaitez que votre propriété et la colonne de firebase database portent le même nom, vous pouvez renommer la propriété ultérieurement et supprimer l’atsortingbut Column .

    Ajout à la réponse de Josh Gallagher:

    Dans certains endroits, la syntaxe sp_RENAME est décrite comme suit:

     sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN' 

    Cependant, cela inclura les crochets dans le nouveau nom de la colonne.

    La méthode RenameColumn () de DbMigration fera probablement de même, évitez donc d’utiliser des crochets lorsque vous spécifiez le nouveau nom de colonne.

    De même, les commandes générées automatiquement dans Up () & Down () incluent DropPrimaryKey () et AddPrimaryKey () si la colonne en cours de modification fait partie de la clé primaire. Ceux-ci ne sont pas nécessaires lors de l’utilisation de RenameColumn (). Le sp_RENAME sous-jacent met automatiquement à jour la clé primaire si nécessaire.

    vous avez 2 étapes pour renommer la colonne dans la première migration du code

    1. La première étape, vous ajoutez ColumnAtsortingbute au-dessus de votre colonne qui sont modifiés, puis la commande update-database

    [Colonne (“Contenu”)]
    chaîne publique Description {set; obtenir; }

    1. La deuxième étape,

      • add-migration yournamechange commande afin de créer une classe partielle DbMigration.

      • append dans la méthode de haut en bas ici

    RenameColumn (“yourDatabase”, “name”, “newName”);

     public override void Up() { RenameColumn("dbo.your_database", "oldColumn", "newColumn"); } public override void Down() { RenameColumn("dbo.your_database", "newColumn", "oldColumn"); } 

    Parce que lorsque vous vous connectez, votre firebase database et votre classe de modèle communiquent via name_column at database et name_type at property method dans le modèle ci-dessus.

    comme + Josh Gallagher dit, vous pouvez utiliser up () pour faire des choses comme:

     public override void Up() { RenameColumn("dbo.atable","odlanem","newname"); AddColumn("dbo.anothertable", "columname", c => c.Ssortingng(maxLength: 250)); } 

    J’ai trouvé cela une aide précieuse dans la migration;)