web-dev-qa-db-fra.com

L'objet 'DF __ *' dépend de la colonne '*' - Passage de int à double

En gros, ma base de données EF contient une table 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 int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }

Cela fonctionne bien cependant lorsque je modifie int de Rating en un double, je reçois le message d'erreur suivant lors de la mise à jour de la base de données:

L'objet 'DF _ Films _ Rating__48CFD27E' est dépendant de la colonne 'Rating'. ALTER TABLE ALTER COLUMN La classification a échoué car un ou plusieurs objets y ont accédé. colonne.

Quel est le problème?

152
Jordan Axe

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 attributs de la table dans Object Explorer, suivi de la catégorie . Contraintes comme indiqué ci-dessous :

Tree of your table

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

233
Joe Taras

C'est le chemin tsql

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

Par souci d'exhaustivité, cela montre simplement le commentaire de @Joe Taras en réponse

43
Luis Siquot

J'ajoute ceci en réponse pour expliquer d'où vient la contrainte. J'ai essayé de le faire dans les commentaires mais il est difficile d'éditer bien ici: - /

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

Dans votre tableau par exemple, cela pourrait être:

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

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

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 à référencer 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 2 dernières instructions pour modifier la colonne et nommer la contrainte sur une ligne (vous devez le faire s'il s'agit d'une table existante).

39
h3adache

Comme la contrainte a un nom imprévisible, vous pouvez écrire un script spécial (DropConstraint) pour le 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));    
}
20
Slava Utesinov

Lorsque nous essayons de supprimer une colonne sur laquelle nous comptons, nous voyons ce type d'erreur:

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

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

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;

Exemple:

Msg 5074, Niveau 16, Etat 1, Ligne 1

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

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

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

contrainte 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
7
Jinna Balu

MS SQL Studio s’occupe de la suppression de la colonne, mais si vous devez supprimer une contrainte par programme , voici une solution simple

Voici un extrait de code qui supprimera une colonne avec une contrainte par défaut:

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__')

Il suffit de remplacer TableName et ColumnName par les valeurs appropriées. Vous pouvez exécuter cette opération en toute sécurité même si la colonne a déjà été supprimée.

Bonus : Voici le code permettant de supprimer les clés étrangères et autres types de contraintes.

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

Blog

2
AZ_

Solution :

ouvrir la table de la base de données -> développer la table -> développer les contraintes et voir ceci

screenshot

1
Arup Mahapatra