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?
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 :
Vous devez supprimer la contrainte avant de modifier le type de champ.
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
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).
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));
}
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
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