dependent - smallint sql server rango
El objeto ''DF__*'' depende de la columna ''*''-Cambio de int a doble (8)
Solución:
abrir la tabla de la base de datos -> expandir la tabla -> expandir las restricciones y ver esto
Básicamente obtuve una tabla en mi base de datos EF con las siguientes propiedades:
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }
Funciona bien, sin embargo, cuando cambio el int de Rating para que sea doble, aparece el siguiente error al actualizar la base de datos:
El objeto ''DF_ Movies _Rating__48CFD27E'' depende de la columna ''Rating''. ALTER TABLE ALTER COLUMN Rating falló porque uno o más objetos acceden a esta columna.
¿Cual es el problema?
Como la restricción tiene un nombre impredecible, puede escribir una secuencia de comandos especial ( DropConstraint ) para eliminarla sin saber su nombre (se probó en EF 6.1.3):
public override void Up()
{
DropConstraint();
AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false));
}
private void DropConstraint()
{
Sql(@"DECLARE @var0 nvarchar(128)
SELECT @var0 = name
FROM sys.default_constraints
WHERE parent_object_id = object_id(N''dbo.MyTable'')
AND col_name(parent_object_id, parent_column_id) = ''Rating'';
IF @var0 IS NOT NULL
EXECUTE(''ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT ['' + @var0 + '']'')");
}
public override void Down()
{
AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false));
}
Cuando intentamos soltar una columna de la que depende, vemos este tipo de error:
El objeto ''DF __ *'' depende de la columna ''''.
elimine la restricción que depende de esa columna con:
ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;
Ejemplo:
Msg 5074, nivel 16, estado 1, línea 1
El objeto '' DF__Employees__Colf__1273C1CD'' depende de la columna ''Colf''.
Msg 4922, nivel 16, estado 9, línea 1
ALTER TABLE DROP COLUMN Colf falló porque uno o más objetos acceden a esta columna.
Restricción de abandono (DF__Employees__Colf__1273C1CD):
ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;
Entonces puedes soltar la Columna:
Alter Table TableName Drop column ColumnName
Esta es la forma tsql
ALTER TABLE yourtable DROP CONSTRAINT constraint_name -- DF_Movies_Rating__48CFD27E
Para completar, esto solo muestra el comentario de @Joe Taras como una respuesta
Estoy agregando esto como respuesta para explicar de dónde viene la restricción. Intenté hacerlo en los comentarios, pero es difícil editarlo bien allí: - /
Si crea (o altera) una tabla con una columna que tenga valores predeterminados, creará la restricción por usted.
En su tabla, por ejemplo, podría ser:
CREATE TABLE Movie (
...
rating INT NOT NULL default 100
)
Creará la restricción para el valor predeterminado 100.
Si en su lugar lo creas así
CREATE TABLE Movie (
name VARCHAR(255) NOT NULL,
rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
);
Luego obtienes una restricción bien nombrada que es más fácil de referencia cuando estás alterando dicha tabla.
ALTER TABLE Movie DROP CONSTRAINT rating_default;
ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL;
-- sets up a new default constraint with easy to remember name
ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;
Puede combinar esas dos últimas declaraciones para modificar la columna y nombrar la restricción en una línea (debe hacerlo si es una tabla existente de todos modos)
MS SQL Studio se ocupa de cuando elimina la columna, pero si necesita eliminar la restricción programáticamente, aquí hay una solución simple
Aquí hay un fragmento de código que soltará una columna con una restricción predeterminada:
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID(''__TableName__'') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N''__ColumnName__'' AND object_id = OBJECT_ID(N''__TableName__''))
IF @ConstraintName IS NOT NULL
EXEC(''ALTER TABLE __TableName__ DROP CONSTRAINT '' + @ConstraintName)
IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id(''__TableName__'') AND name=''__ColumnName__'')
EXEC(''ALTER TABLE __TableName__ DROP COLUMN __ColumnName__'')
Simplemente reemplace TableName y ColumnName con los valores apropiados. Puede ejecutar esto de forma segura incluso si la columna ya se ha eliminado.
Bonificación : aquí está el código para soltar claves externas y otros tipos de restricciones.
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = ''__TableName__'' AND COLUMN_NAME = ''__ColumnName__'')
BEGIN
SELECT @ConstraintName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = ''__TableName__'' AND COLUMN_NAME = ''__ColumnName__''
EXEC(''ALTER TABLE __TableName__ DROP CONSTRAINT '' + @ConstraintName)
END
Prueba esto:
Elimine la restricción DF_Movies_Rating__48CFD27E antes de cambiar su tipo de campo.
La restricción es típicamente creada automáticamente por el DBMS (SQL Server).
Para ver la restricción asociada con la tabla, expanda los atributos de la tabla en el Explorador de objetos , seguido por las Restricciones de la categoría como se muestra a continuación:
Debe eliminar la restricción antes de cambiar el tipo de campo.
Tuve este error al intentar ejecutar una migración para solucionarlo. Cambié el nombre de la columna y volví a generar la migración usando
add-migration migrationname -force
en la consola del administrador de paquetes. Entonces pude correr
update-database
exitosamente.