L'object 'DF __ *' dépend de la colonne '*' – Changer int pour doubler

Fondamentalement, j'ai une table dans ma database EF avec les propriétés suivantes:

public int Id { get; set; } public ssortingng Title { get; set; } public ssortingng Description { get; set; } public ssortingng Image { get; set; } public ssortingng WatchUrl { get; set; } public int Year { get; set; } public ssortingng Source { get; set; } public int Duration { get; set; } public int Rating { get; set; } public virtual ICollection<Category> Categories { get; set; } 

Cela fonctionne cependant bien quand je change l'int de Rating pour être un double j'obtiens l'erreur suivante en mettant à jour la database:

L'object 'DF_ Movies _Rating__48CFD27E' dépend de la colonne 'Rating'. ALTER TABLE ALTER COLUMN Echec de l'évaluation car un ou plusieurs objects accèdent à cette colonne.

Quel est le problème?

Essaye ça:

Supprimez la contrainte DF_Movies_Rating__48CFD27E avant de modifier votre type de champ.

La contrainte est généralement créée automatiquement par le SGBD (SQL Server).

Pour voir la contrainte associée à la table, développez les attributes de la table dans l' explorateur d'objects , suivi de la catégorie Contraintes comme indiqué ci-dessous:

Arbre de ta table

Vous devez supprimer la contrainte avant de modifier le type de champ.

C'est la manière tsql

  ALTER TABLE yourtable DROP CONSTRAINT constraint_name -- DF_Movies_Rating__48CFD27E 

Pour être complet, ceci montre juste le commentaire de @Joe Taras comme réponse

J'ajoute ceci comme une réponse pour expliquer d'où vient la contrainte. J'ai essayé de le faire dans les commentaires mais il est difficile d'éditer joliment là: – /

Si vous créez (ou modifiez) une table avec une colonne qui a des valeurs par défaut, elle créera la contrainte pour vous.

Dans votre tableau par exemple, il pourrait être:

 CREATE TABLE Movie ( ... rating INT NOT NULL default 100 ) 

Cela créera la contrainte pour le défaut 100.

Si vous le créez plutôt comme si

 CREATE TABLE Movie ( name VARCHAR(255) NOT NULL, rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100 ); 

Ensuite, vous obtenez une contrainte bien nommée qui est plus facile à referencer lorsque vous modifiez ladite table.

 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; 

Vous pouvez combiner ces deux dernières instructions pour modifier la colonne et nommer la contrainte en une ligne (il faut le faire s'il s'agit d'une table existante)

Comme la contrainte a un nom imprévisible, vous pouvez écrire un script spécial ( DropConstraint ) pour l'enlever sans connaître son nom (a été testé à 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)); } 

Lorsque nous essayons d'abandonner une colonne qui dépend de nous, nous voyons ce genre d'erreur:

L'object 'DF __ *' dépend de la colonne ''.

abandonne la contrainte qui dépend de cette colonne avec:

 ALTER TABLE TableName DROP CONSTRAINT dependent_constraint; 

Exemple:

Msg 5074, niveau 16, état 1, ligne 1

L'object ' DF__Employees__Colf__1273C1CD' dépend de la colonne 'Colf'.

Msg 4922, niveau 16, état 9, ligne 1

ALTER TABLE DROP COLUMN Colf a échoué car un ou plusieurs objects accèdent à cette colonne.

Déposez la contrainte (DF__Employees__Colf__1273C1CD):

 ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD; 

Ensuite, vous pouvez déposer la colonne:

 Alter Table TableName Drop column ColumnName 

Solution :

Ouvrez la table de database -> développez la table -> développez les contraintes et voyez ceci

capture d'écran

J'ai eu cette erreur en essayant d'exécuter une migration pour contourner le problème, j'ai renommé la colonne et recréé la migration en utilisant

 add-migration migrationname -force 

dans la console du gestionnaire de packages. J'étais alors capable de courir

 update-database 

avec succès.