2012-06-19 3 views
7

Sto utilizzando EF 4.3.1 Code First Migrations. Ho una tabella come:Migrazioni EF: Sposta tabella da 2 colonne PK a colonna singola causa ALTER prima di DROP e fallisce

public class Product 
{ 
    [Key] 
    [Column(Order=0)] 
    [MaxLength(100)] 
    public string Store { get; set; } 

    [Key] 
    [Column(Order=1)] 
    [MaxLength(100)] 
    public string Sku { get; set; } 
}​ 

Ho una tabella esistente creata con il codice precedente. Poi mi sono trasferito a una singola colonna di chiave primaria:

public class Product 
{ 
    [MaxLength(100)] 
    public string Store { get; set; } 

    [Key] 
    [MaxLength(100)] 
    public string Sku { get; set; } 
}​ 

Questo fa sì che EF a fallire nella prossima migrazione automatica, lamentandosi:

ALTER TABLE [prodotto] modificare la colonna [Store] nvarchar

L'oggetto "PK_Product" dipende dalla colonna "Store". ALTER TABLE ALTER COLUMN L'archivio non è riuscito perché uno o più oggetti accedono a questa colonna .

Chiaramente PK_Product deve essere eliminato prima di tentare di attivare questa istruzione ALTER (perché modifica la colonna?), Ma la migrazione non riesce.

Sto facendo qualcosa di sbagliato o si tratta di un bug? Soluzioni alternative?

risposta

13

Non sarà possibile eseguire questa operazione con una migrazione automatica. Dovrai creare una migrazione utilizzando Add-Migration e quindi modificarla in modo che modifichi solo il PK.

La migrazione può essere semplice come:

public partial class TheMigration : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("Products", new[] { "Store", "Sku" }); 
     AddPrimaryKey("Products", "Sku"); 
    } 

    public override void Down() 
    { 
     DropPrimaryKey("Products", new[] { "Sku" }); 
     AddPrimaryKey("Products", new[] { "Store", "Sku" }); 
    } 
} 

EF sta modificando la colonna in quanto, quando è parte di un Key, è implicitamente NOT NULL. Puoi lasciarlo così com'è, aggiungere un attributo [Required] o consentire a EF di modificare la colonna dopo il lasciando cadere il PK.

+0

Add-Migration ha generato i precedenti comandi (e altro). Si scopre che erano semplicemente fuori servizio - spostando DropPrimaryKey come hai fatto qui sopra prima della modifica della colonna, è stato risolto. Quindi, per essere chiari, la migrazione finale è stata DropPrimaryKey, AlterColumn, AddPrimaryKey. Penso che questo sia un bug in Migrations data la semplicità della soluzione, piuttosto che una limitazione intrinseca. –

+0

Sì, quindi il mio ** grassetto ** nel "dopo" :-) –