231 votes

L'objet 'DF__*' dépend de la colonne '*' - Changer int en double

Fondamentalement, j'ai une table dans ma base de données EF avec les propriétés suivantes :

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 double Rating { get; set; }
public virtual ICollection Categories { get; set; }

Ça fonctionne bien cependant lorsque je change l'int de Rating pour être un double, j'obtiens l'erreur suivante lors de la mise à jour de la base de données :

L'objet 'DF_Movies_Rating__48CFD27E' dépend de la colonne 'Rating'. ALTER TABLE ALTER COLUMN Rating a échoué car un ou plusieurs objets accèdent à cette colonne.

Quel est le problème ?

340voto

Joe Taras Points 4050

Essayez ceci :

Supprimez la contrainte DF_Movies_Rating__48CFD27E avant de modifier le 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 attributs de la table dans l'explorateur d'objets, suivi de la catégorie Contraintes comme indiqué ci-dessous :

Arborescence de votre table

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

80voto

h3adache Points 145

Je rajoute ceci en réponse pour expliquer d'où vient la contrainte. J'ai essayé de le faire dans les commentaires mais c'est difficile à éditer correctement :-/

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

Dans votre table par exemple, cela pourrait être :

CREATE TABLE Film (
    ...
    note INT NOT NULL default 100
)

Cela créera la contrainte pour la valeur par défaut 100.

Si vous le créez plutôt de cette manière

CREATE TABLE Film (
  nom VARCHAR(255) NOT NULL,
  note INT NOT NULL CONSTRAINT note_par_defaut DEFAULT 100
);

Alors vous obtenez une contrainte joliment nommée qui est plus facile à référencer lorsque vous modifiez ladite table.

ALTER TABLE Film DROP CONSTRAINT note_par_defaut;
ALTER TABLE Film ALTER COLUMN note DÉCIMAL(2) NOT NULL;
-- établit une nouvelle contrainte par défaut avec un nom facile à retenir
ALTER TABLE Film ADD CONSTRAINT note_par_defaut DEFAULT ((1.0)) POUR note;

Vous pouvez combiner ces 2 dernières déclarations pour modifier la colonne et nommer la contrainte en une seule ligne (vous devez le faire de toute façon si c'est une table existante)

53voto

Luis Siquot Points 2943

C'est la méthode tsql

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

Pour plus de complétude, cela montre simplement le commentaire de @Joe Taras sous forme de réponse

34voto

Slava Utesinov Points 10557

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

15voto

Jinna Balu Points 1246

Lorsque nous essayons de supprimer une colonne qui est dépendante, nous voyons ce genre d'erreur :

L'objet 'DF__*' dépend de la colonne ''.

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

ALTER TABLE NomTable DROP CONSTRAINT contrainte_dependante;

Exemple:

Msg 5074, Level 16, State 1, Line 1

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

Msg 4922, Level 16, State 9, Line 1

ALTER TABLE DROP COLUMN Colf failed because one or more objects access this column.

Supprimez la contrainte(DF__Employees__Colf__1273C1CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

Ensuite vous pouvez supprimer la colonne:

Alter Table NomTable Drop column NomColonne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X