Al agregar una nueva columna no anulable a una tabla mediante el uso de las primeras migraciones de código, creará automáticamente un valor predeterminado para usted. Esto tiene sentido porque las filas existentes deben tener un valor para la nueva columna (ya que no puede ser nulo). Está bien, pero después de que ese valor se asigna en todas partes, ya no lo quiero más. No admite nulos, porque quiero asegurarme de que siempre se inserte explícitamente un valor. Si todo está predeterminado en '' o 0, tendré cadenas mágicas. De todos modos, puedo levantar una solución, que no me entusiasma, pero funciona.Eliminación de una restricción predeterminada después de agregar una nueva columna en el código primero
Después de agregar la columna, elimino la restricción predeterminada.
public override void Up()
{
AddColumn("dbo.SomeTable", "NewColumn", c => c.Int(nullable: false));
Sql(Helpers.DropDefaultConstraint("dbo.SomeTable", "NewColumn"));
}
...
public static string DropDefaultConstraint(string table, string column)
{
return string.Format(@"
DECLARE @name sysname
SELECT @name = dc.name
FROM sys.columns c
JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id
WHERE c.object_id = OBJECT_ID('{0}')
AND c.name = '{1}'
IF @name IS NOT NULL
EXECUTE ('ALTER TABLE {0} DROP CONSTRAINT ' + @name)
",
table, column);
}
PROS: Una vez implementado el método de ayuda, sólo hay que añadir una línea simple de quitar la restricción. CONS: Parece innecesario crear un índice solo para eliminarlo.
Otro enfoque sería alterar la migración generada, por lo que agregamos que tiene valores de nulos, actualiza todos los valores y luego no puede contener nulos.
public override void Up()
{
AddColumn("dbo.SomeTable", "NewColumn", c => c.Int());
Sql("UPDATE dbo.SomeTableSET NewColumn= 1");
AlterColumn("dbo.SomeTable", "NewColumn", c => c.Int(nullable: false));
}
PROS: parece más sencillo/limpiador
CONS: tener que alterar mis limitaciones temporalmente (I asumir esta se ejecuta en una transacción y por lo tanto no se debe permitir que los malos datos in). La actualización puede ser lenta en las tablas grandes.
¿Qué método es preferible? ¿O hay una mejor manera en la que me estoy perdiendo?
Nota: He demostrado el caso en el que está agregando y limpiando definiciones de columna de una vez. Si solo está limpiando los valores predeterminados de migraciones anteriores, el segundo enfoque no es útil.
La solución 1 me ayudó a eliminar una restricción predeterminada, gracias. – angularsen
esto es impresionante –