2012-06-19 13 views
7

Estoy usando EF 4.3.1 Primero las migraciones de código. Tengo una tabla como:Migraciones de EF: Mover la tabla de 2 Columna PK a Columna única causa ALTER antes de DROP y falla

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; } 
}​ 

Tengo una tabla existente creada con el código anterior. Luego me mudé a una clave principal de una sola columna:

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

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

Esto provoca EF falle en la próxima migración automática, quejándose:

ALTER TABLE [producto] modifica la columna [tienda] nvarchar

El objeto 'PK_Product' depende de la columna 'Almacenar'. ALTER TABLE ALTER COLUMN Error en la tienda porque uno o más objetos acceden a esta columna .

Claramente, se debe eliminar el PK_Product antes de intentar activar esta instrucción ALTER (¿por qué está alterando la columna?), Pero en su lugar falla la migración.

¿Estoy haciendo algo mal o es esto un error? ¿Soluciones provisionales?

Respuesta

13

No podrá hacer esto con una migración automática. Deberá crear una migración usando Add-Migration y luego cambiarla para que solo modifique PK.

La migración puede ser tan simple como:

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 está alterando la columna, ya que, cuando es parte de un Key, es implícitamente NOT NULL. Puede dejarlo como está, agregar un atributo [Required], o permitir que EF modifique la columna después de soltar el PK.

+0

Add-Migration pregenera los comandos anteriores (y más). Resulta que simplemente estaban fuera de servicio: moviendo DropPrimaryKey como lo has hecho aquí antes del cambio de columna, se resolvió. Entonces, para que quede claro, la migración final fue DropPrimaryKey, AlterColumn, AddPrimaryKey. Creo que esto es un error en Migrations dada la simplicidad de la solución, más que una limitación inherente. –

+0

Sí, de ahí mi ** negrita ** en el "después" :-) –

Cuestiones relacionadas