2012-10-27 29 views

risposta

88

Modificare manualmente i metodi Su e Giù della migrazione di utilizzare il metodo RenameColumn per sostituire il AddColumn e DropColumn che genera automaticamente per voi.

+7

Fai attenzione ai nomi di tabelle che contengono dei punti. 'RenameColumn' genera un'istruzione T-SQL' sp_rename' che usa internamente 'parsename' che ha alcune limitazioni. Quindi, se hai un nome di tabella che contiene dei punti, ad es. "SubSystemA.Tablename" quindi usa: 'RenameColumn (" dbo. [SubSystemA.Tablename] "," OldColumnName "," NewColumnName ");' – Ilan

4

Ora, questa risposta è basata sulla mia conoscenza di EF4.3, quindi spero che le migrazioni funzionino grosso modo uguali in EF5 :) Dopo aver creato una migrazione, dovresti essere in grado di aggiungere codice in Up e Metodi giù, tra il rilascio della vecchia proprietà e la creazione della nuova proprietà. Questo codice dovrebbe spostare i dati di proprietà nella direzione corretta. L'ho risolto con il metodo SQL() in cui è possibile inserire SQL raw per eseguire lo spostamento dei dati.

Nel metodo Up della migrazione:

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

e nel metodo di Down():

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

Lo svantaggio di questo approccio è che si può accoppiare il vostro codice con il database stiamo lavorando con al momento (dal momento che stai scrivendo SQL raw specifico per DB). Potrebbero esserci anche altri metodi disponibili per il movimento dei dati.

Maggiori informazioni disponibili su: MSDN

2

aggiunta alla risposta di Josh Gallagher:

In alcuni luoghi la sintassi sp_rename è descritto in questo modo:

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

tuttavia, che effettivamente includere le parentesi nel nuovo nome di colonna.

Il metodo RenameColumn() di DbMigration probabilmente farà lo stesso, quindi evitare di usare parentesi quando si specifica il nome della nuova colonna.

Inoltre, i comandi generati automaticamente in Su() & Giù() includono DropPrimaryKey() e AddPrimaryKey() se la colonna che si sta rinominando fa parte della chiave primaria. Questi non sono necessari quando si utilizza RenameColumn(). Lo sp_RENAME sottostante aggiorna automaticamente la chiave primaria, se necessario.

0

come + Josh Gallagher ha detto, è possibile utilizzare fino() per fare le cose come:

public override void Up() 
     { 

      RenameColumn("dbo.atable","odlanem","newname"); 
      AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250)); 

     } 

ho trovato this un buon aiuto in gettin in migrazione;)

23

As already said, sostituire il AddColumn e DropColumn che viene generato automaticamente con RenameColumn.

Esempio:

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.String(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.String(nullable: false, maxLength: 50)); 
      DropColumn("dbo.MyTable", "NewColumn"); 

      // Add this line 
      RenameColumn("dbo.MyTable", "NewColumn", "OldColumn"); 
     } 
    } 
} 
2

È può ottenere la migrazione di chiamare RenameColumn per voi, se si esegue questa operazione:

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

Ecco la migrazione generato:

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

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

Se vuoi che la tua proprietà e la colonna DB siano uguali a na io, puoi rinominare la proprietà in un secondo momento e rimuovere l'attributo Column.

+0

E solo per aggiungere un altro suggerimento utile, puoi anche eseguirlo nel Gestore pacchetti Console: 'Update-Database -Script'. Quindi puoi ottenere il comando SQL 'sp_rename' da eseguire a tuo piacimento. : D – Jess

1

si hanno 2 passaggi per rinominare colonna nel codice prima migrazione

  1. Il primo passo, si aggiunge ColumnAttribute sopra la colonna che sono cambiato, e quindi aggiornare database comando

[ Colonna ("Contenuto")]
public string Descrizione {set; ottenere; }

  1. Il secondo passo,

    • aggiuntivo migrazione comando yournamechange al fine di creare un DbMigration classe parziale.

    • aggiungere in su e il metodo qui

RenameColumn ("yourDatabase", "Nome", "newName") verso il basso;

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


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

Perché quando ci si connette, il database e il modello di classe comunicherà via name_column al database e name_type al metodo di proprietà nel modello di cui sopra.

Problemi correlati