web-dev-qa-db-ja.com

オブジェクト 'DF __ *'は列 '*'に依存しています - intをdoubleに変更します

基本的に私は自分のEFデータベースに以下のプロパティを持つテーブルを持っています。

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; }

ただし、Ratingのintをdoubleに変更すると、データベースを更新するときに次のようなエラーが表示されます。

オブジェクト 'DF _Movies_ Rating__48CFD27E'は列 'Rating'に依存しています。ALTER TABLE ALTER COLUMN 1つ以上のオブジェクトがこれにアクセスしているため、評価に失敗しました。列。

問題は何ですか?

143
Jordan Axe

これを試して:

フィールドタイプを変更する前に、制約DF_Movies_Rating__48CFD27Eを削除してください。

制約は通常、DBMS(SQL Server)によって自動的に作成されます。

テーブルに関連付けられている制約を表示するには、下に示すように、Object Explorerでテーブル属性を展開し、続いてカテゴリ制約を展開します。 :

Tree of your table

フィールドタイプを変更する前に、制約を削除する必要があります。

227
Joe Taras

これはtsqlのやり方です

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

完全を期すために、これは答えとして@Joe Tarasのコメントを示しているだけです。

40
Luis Siquot

制約の由来を説明するための応答としてこれを追加しています。私はコメントの中でそれをやろうとしました、しかしそれがそこでうまく編集するのが難しいです: - /

デフォルト値を持つ列を使ってテーブルを作成(または変更)すると、制約が作成されます。

たとえば、あなたのテーブルでは、次のようになります。

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

デフォルト100の制約が作成されます。

あなたが代わりにそのように作成した場合

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

それからあなたはあなたが言ったテーブルを変更しているとき参照しやすい、わかりやすい名前の制約を得ます。

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;

最後の2つのステートメントを組み合わせて、列を変更し、1行で制約に名前を付けることができます(いずれにしても既存のテーブルである場合は、変更する必要があります)。

38
h3adache

Constraintは予測不可能な名前を持っているので、名前を知らなくてもそれを削除する特別なスクリプト(DropConstraint)を書くことができます(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));    
}
19
Slava Utesinov

依存している列を削除しようとすると、このようなエラーが発生します。

オブジェクト 'DF __ *'は列 ''に依存しています。

その列に依存している制約を削除します。

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;

例:

メッセージ5074、レベル16、状態1、行1

オブジェクト 'DF__Employees__Colf__1273C1CD'は列 'Colf'に依存しています。

メッセージ4922、レベル16、状態9、行1

ALTER TABLE DROP COLUMN 1つ以上のオブジェクトがこの列にアクセスするため、Colfは失敗しました。

ドロップ制約(DF__Employees__Colf__1273C1CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

そして、あなたは列をドロップすることができます:

Alter Table TableName Drop column ColumnName
6
Jinna Balu

解決策:

データベーステーブルを開く - >テーブルの拡張 - >制約の拡張

screenshot

1
Arup Mahapatra

MS SQL Studioでは、列を削除するときに注意が必要ですが、プログラム的に制約を削除する必要がある場合、ここでは簡単な解決策を示します。

これは、デフォルトの制約で列を削除するコードスニペットです。

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

TableNameColumnNameを適切な値に置き換えてください。列がすでに削除されている場合でも、これを安全に実行できます。

ボーナス:これは外部キーや他の種類のを削除するコードです。制約

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

ブログ

1
AZ_