programing

개체 'DF__*'이(가) '*' 열에 종속됨 - int를 이중으로 변경

padding 2023. 4. 8. 08:02
반응형

개체 'DF__*'이(가) '*' 열에 종속됨 - int를 이중으로 변경

기본적으로 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 등급이 실패했습니다.

뭐가 문제야?

이것을 시험해 보세요.

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

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

테이블과 관련된 제약조건을 표시하려면 오브젝트 탐색기에서 테이블 속성을 펼친 후 다음과 같이 [Constraints]카테고리를 펼칩니다.

테이블 트리

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

제약이 어디서 비롯됐는지 설명하기 위해 이 말을 덧붙입니다.댓글로 하려고 했는데 거기서는 편집이 잘 안 돼:-/

기본값이 있는 컬럼으로 테이블을 작성(또는 변경)하면 제약조건이 생성됩니다.

테이블에는 다음과 같은 것이 있습니다.

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;

마지막 두 문을 결합하여 열을 변경하고 제약 조건을 한 줄로 지정할 수 있습니다(기존 테이블인 경우 반드시 지정해야 함).

은 ★★★입니다.tsql

 ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E

완성도를 높이기 위해 @Joe Taras의 코멘트를 답변으로 제시합니다.

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

종속된 열을 삭제하려고 하면 다음과 같은 오류가 나타납니다.

개체 'DF__*'은 열 '에 종속되어 있습니다.

다음과 같이 해당 열에 종속된 구속조건을 삭제합니다.

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;

예:

메시지 5074, 레벨 16, 스테이트 1, 라인 1

개체 'DF__Employes__Colf__1273C1'CD'는 'Colf' 열에 종속됩니다.

메시지 4922, 레벨 16, 스테이트 9, 라인 1

하나 이상의 개체가 이 열에 액세스하기 때문에 ALTER TABLE DROP COLUMN Colf가 실패했습니다.

드롭 제약(DF__Employes__Colf__1273C1)CD):

ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;

그런 다음 열을 드롭할 수 있습니다.

Alter Table TableName Drop column ColumnName

해결책:

open database table -> expand table -> 제약조건을 전개하여 다음을 참조해 주십시오.

스크린샷

여러 테이블에서 열을 삭제하는 동안 다음과 같은 기본 제약 조건 오류가 발생했습니다.열의 데이터 유형을 변경해야 하는 경우에도 유사한 문제가 나타납니다.

개체 'DF_TableName_ColumnName'은 'ColumnName' 열에 종속되어 있습니다.

이 문제를 해결하려면 먼저 다음 쿼리를 사용하여 모든 제약을 해제해야 합니다.

DECLARE @sql NVARCHAR(max)=''     
SELECT @SQL += 'Alter table ' + Quotename(tbl.name) + '  DROP constraint ' + Quotename(cons.name) + ';'
 FROM SYS.DEFAULT_CONSTRAINTS cons 
 JOIN   SYS.COLUMNS col ON col.default_object_id = cons.object_id
 JOIN   SYS.TABLES tbl ON tbl.object_id = col.object_id
 WHERE  col.[name] IN ('Column1','Column2')

--PRINT @sql
EXEC Sp_executesql @sql 

그 후 모든 컬럼을 삭제했습니다(요건, 이 질문에는 기재되어 있지 않습니다).

DECLARE @sql NVARCHAR(max)='' 
SELECT @SQL += 'Alter table ' + Quotename(table_catalog)+ '.' + Quotename(table_schema) + '.'+ Quotename(TABLE_NAME) 
               + '  DROP column ' + Quotename(column_name) + ';'
FROM   information_schema.columns where COLUMN_NAME IN ('Column1','Column2')  
--PRINT @sql
EXEC Sp_executesql @sql 

누군가 같은 문제를 발견할까 봐 여기에 글을 올렸습니다.

해피 코딩!

이 에러를 회피하기 위해 이행을 실행하려고 할 때 오류가 발생했습니다.컬럼의 이름을 변경하고 다음 명령을 사용하여 이행을 다시 생성했습니다.

add-migration migrationname -force

패키지 매니저 콘솔로 이동합니다.나는 그때 달릴 수 있었다.

update-database

성공했습니다.

언급URL : https://stackoverflow.com/questions/19460912/the-object-df-is-dependent-on-column-changing-int-to-double

반응형