'DF __ *'개체는 '*'열에 종속됩니다. int를 double로 변경


168

기본적으로 나는 다음 속성을 가진 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; }

그러나 등급의 int를 double로 변경하면 데이터베이스를 업데이트 할 때 다음 오류가 발생합니다.

'DF_ Movies _Rating__48CFD27E' 개체 는 'Rating'열에 종속됩니다. ALTER TABLE ALTER COLUMN 하나 이상의 개체가이 열에 액세스하므로 평가에 실패했습니다.

무엇이 문제입니까?


1
제약 조건 DF_Movies_Rating__48CFD27E를 제거한 다음 필드 유형을 변경하십시오.
Joe Taras

@JoeTaras 그러나 나는 그런 제약을 만들지 않았습니다. 무엇이며 어디서 찾을 수 있습니까?
Jordan Ax

2
필드를 작성할 때 DBMS는 자동으로 제한 조건을 작성합니다. 테이블 정보를 확장하면 제약 조건 섹션에서 찾을 수 있습니다. ;)
Joe Taras

답변:


252

이 시도:

필드 유형을 변경하기 전에 DF_Movies_Rating__48CFD27E 제한 조건을 제거하십시오 .

제약 조건은 일반적으로 DBMS (SQL Server)에 의해 자동으로 생성됩니다.

테이블과 연관된 제한 조건을 보려면 아래에 표시된대로 오브젝트 탐색기 에서 테이블 속성을 펼치고 제한 조건 범주를 펼치 십시오.

당신의 테이블의 나무

필드 유형을 변경하기 전에 구속 조건을 제거해야합니다.


40
@ManirajSS : ALTER TABLE yourtable DROP CONSTRAINT DF_Movies_Rating__48CFD27E
Joe Taras

18
구속 조건 생성을 유발 한 원인은 무엇입니까? 나는 그들 중 많은 것을 가지고 있으며, 나는 정말로 그들을 원하지 않습니다!
Simon Parker

5
흠, 그리고 내 프레임 워크 (Laravel)의 DB 마이그레이션과 dropColumn을 사용하려면 어떻게해야합니까? 나는 어떻게 :( SQL 서버에 의해 자동 생성 이상한 이름을 가진 제약 드롭하는 생각이 없습니다
JustAMartin

2
확실합니다 : 폴더를 삭제하고 폴더 제약 조건이 비게되었고 응용 프로그램을 실행하거나 update-database다시 호출하면 이 문제가 게시되었습니다. stackoverflow.com/questions/40267769/…
mshwf

2
도대체 SQLServer가 제약 조건을 암시 적으로 삭제하지 않는 이유는 무엇입니까? 결국 암시 적으로 만들었습니다!
youcantryreachingme

46

이것이 tsql방법입니다

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

완전성을 위해 @Joe Taras의 의견을 답변으로 표시합니다.


46

제약 조건의 출처를 설명하는 응답으로 이것을 추가하고 있습니다. 나는 주석에서 그것을 시도했지만 멋지게 편집하기가 어렵다 :-/

기본값이있는 열이있는 테이블을 만들거나 변경하면 제약 조건이 만들어집니다.

예를 들어 테이블에서 다음과 같습니다.

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;

마지막 두 문을 결합하여 열을 변경하고 제약 조건의 이름을 한 줄로 지정할 수 있습니다 (어쨌든 기존 테이블 인 경우해야합니다)


우선 모든 제약 조건의 이름을 지정하여 문제를 방지하는 방법에 대한 정보를 추가해 주셔서 감사합니다. (즉, 무작위로 명명 된 제약 조건을 삭제하는 문제를 피하십시오)
youcantryreachingme

22

제약 조건에 예측할 수없는 이름이 있으므로 이름 을 모른 채 특수 스크립트 ( 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));    
}

이 답변은 제약 조건 이름을 하드 코딩 할 수없는 마이그레이션 기반 환경에서 효과적입니다.
Menion Leah

AlterColumnX와 같이 AlterColumn에 대해 래퍼 / 확장 / 과부하 기능을 만드는 경우 여기에 DropConstraint 논리를 포함시킬 수 있으며 테이블 이름 및 열 이름을 전달할 수 있으므로 다시 작성할 필요가 없습니다.
N73k

10

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
지금 내 인생을 두 번 구했습니다. 둘 다 검사 제한 조건을 삭제해야합니다. 우선 첫 번째 쿼리를 사용해야합니다. 둘째, SYS.DEFAULT_CONSTRAINTS 테이블에 검사 제한 조건이 없으므로 두 번째 쿼리를 사용해야합니다. 고마워요!
일요일

8

의존하는 열을 삭제하려고하면 다음과 같은 오류가 발생합니다.

'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 하나 이상의 개체가이 열에 액세스하므로 Colf가 실패했습니다.

구속 조건 삭제 (DF__Employees__Colf__1273C1CD) :

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

그런 다음 열을 삭제할 수 있습니다.

Alter Table TableName Drop column ColumnName

1

해결책 :

데이터베이스 테이블 열기-> 테이블 확장-> 제약 조건 확장 및 참조

스크린 샷


이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Donald Duck

-1

이 오류를 해결하기 위해 마이그레이션을 실행하려고하면 열의 이름을 바꾸고 다음을 사용하여 마이그레이션을 다시 생성했습니다.

add-migration migrationname -force

패키지 관리자 콘솔에서 나는 그때 달릴 수 있었다

update-database

성공적으로.


2
열 이름은 바뀌지 않습니다. 열을 삭제하고 새 열을 추가합니다. 마이그레이션에 사용자 정의 코드를 추가하지 않으면 열에 존재했던 모든 데이터가 손실됩니다.
caesay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.