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:
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
Ouvrez la table de database -> développez la table -> développez les contraintes et voyez ceci
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.