programing

엔티티 프레임워크 ALTERTABLE 문이 FORIENT KEY

padding 2023. 7. 17. 20:42
반응형

엔티티 프레임워크 ALTERTABLE 문이 FORIENT KEY

Entity Framework의 데이터베이스를 업데이트할 때 코드 첫 마이그레이션에서 다음 오류가 발생합니다.

ALTER TABLE 문이 FORIENT KEY 제약 조건 "FK_dbo"와 충돌했습니다.Clients_dbo.MedicalGroup_MedicalGroupId"입니다.데이터베이스 "hrbc", 테이블 "dbo"에서 충돌이 발생했습니다.의료 그룹", 'ID' 열.

이것은 내 수업입니다.

public partial class Client
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int? MedicalGroupId { get; set; }
    [ForeignKey("MedicalGroupId")]
    public virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = value; } }
}

제 두 번째 수업입니다.

public partial class MedicalGroups
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

그리고 이것이 제가 적용하려는 마이그레이션입니다.

public override void Up()
{
    AddForeignKey("dbo.Clients", "MedicalGroupId", "dbo.MedicalGroups", "Id");
    CreateIndex("dbo.Clients", "MedicalGroupId");
}

데이터베이스에 FK 제약 조건과 충돌하여 작성이 실패하는 기존 데이터가 없는지 확인합니다.

저는 @Cory가 당신을 올바른 해결책에 가깝게 해주고 있다고 생각합니다. 당신은 조사할 시간을 갖지 않았습니다.

마이그레이션 추가 코드에서 마이그레이션이 생성되었을 수 있습니다.

public override void Up()
{
AddColumn("dbo.ClientContacts", "FamilialRelationshipId", c => c.Int(nullable: false));
CreateIndex("dbo.ClientContacts", "FamilialRelationshipId");
AddForeignKey("dbo.ClientContacts", "FamilialRelationshipId", "dbo.FamilialRelationships",        "FamilialRelationshipId");
}

nullable: false. 모델에 int?(nullable int)가 아닌 ID가 있는 경우 마이그레이션 코드는 nullable을 false로 설정합니다.모델에 따르면 기본값이 0인 null이 아닌 항목을 사용하고 있으며 값이 0인 외부 키 항목이 없을 수 있습니다.

이제 외부 키 테이블에 있는 기본값을 생성하거나 SQL Server를 사용하여 제약 조건을 생성하는 경우 선택하지 않고 제약 조건을 생성해야 합니다.그러나 이 점을 기억하십시오.[DefaultValue(0)] 특성으로 속성을 장식하는 경우 기본값이 지정된 경우 SQL Column Add처럼 기존 데이터가 변경되지 않습니다.

모델 클래스를 null 가능한 int로 변경하는 것이 좋습니다.그런 다음 시드 방법에서 데이터 주석의 [DefaultValue] 특성은 데이터를 수정하지 않으므로 dbcontext에 대한 간단한 방법을 만들어 새 열을 기본값으로 업데이트합니다.

Add-Migration / Update-Database를 사용하여 열 및 제약 조건을 만듭니다.그런 다음 null이 아닌 int를 허용하고 모든 행을 외부 키인 Add-Migration/Update-database에 대한 올바른 값으로 변경했다고 가정할 경우 모델을 수정합니다.따라서 모델 마이그레이션에 중단 없는 체인이 제공됩니다.데이터 모델 변경의 흐름이 그대로 유지되므로 나중에 라이브 사이트에 게시할 때 유용합니다.

  • 이게 도움이 되길 바랍니다.

이 오류는 외부 키 제약 조건을 위반하고 있음을 알려줍니다.몇 가지 해결 방법이 있습니다.

  1. 데이터 수정 - 어딘가에 레코드가 있습니다.Clients존재하지 않는 MedicalGroupId를 가진 테이블MedicalGroupstable.하여 '아이디'에 아이디가 합니다.MedicalGroups직접 데이터를 테이블에 올려 수동으로 수정할 수 있습니다.
  2. 외부제약 조건 제거 - 외부 키 제약 조건을 제거하면 더 이상 이 메시지에 영향을 받지 않습니다.유감스럽게도 데이터베이스는 더 이상 이 관계를 적용하지 않으며 나중에 이 문제를 더 악화시킬 수 있습니다.
  3. 다음을 사용하여 제약 조건 만들기 - 다음을 사용하여 외부 키 제약 조건을 만들 수 있습니다.WITH NOCHECK 에 이 합니다. INSERT/UPDATESDEETE에서 이 조건을 합니다.이 옵션은 SQL Server가 기존 데이터에 이 제약 조건을 적용하지 않도록 지시합니다. SQL Server는 이후의 모든 INSERT/UPDATES/DEETE에서 이 제약 조건을 확인합니다.

코드 우선 엔터티 프레임워크를 사용하고 기존 데이터가 있는 테이블에 필요한 새 열을 추가하려는 경우 여기에 포함될 수도 있습니다.

참고: 이 작업을 수행하기 전에 기존의 모든 행에 대해 이 새 열에 유효한 값을 추가해야 합니다.계속하기 전에 기존 행에 추가할 값을 고려합니다.필요한 룩업 테이블에 "잘못됨" 또는 "알 수 없음"을 나타내는 값을 제공할 수 있습니다.

모델에서 int 뒤에 ?를 추가하여 열을 null로 설정합니다.모델을 저장하고 컴파일합니다.업데이트-데이터베이스를 실행합니다.

예:

[ForeignKey("Title")]
public int? TitleId { get; set; }

DB에서 NULL 값을 유효한 조회 값으로 대체하여 테이블을 업데이트합니다.제 경우 제목 조회 테이블에 "알 수 없음"을 추가한 다음 해당 조회 ID를 참조하도록 모든 행을 대량 편집했습니다.

모델로 돌아가서 열을 더 이상 null로 만들 수 없도록 '?'를 제거합니다.모델 저장 및 컴파일 후 업데이트-데이터베이스 실행

당신은 이제 가도 좋습니다.

.따라서 새 필드를 외래 키처럼 첨부하지 않고 추가해야 합니다. public int? MedicalGroupId { get; set; }. 실행합니다그리고 실행합니다.update-database패키지 관리 콘솔에서 명령을 실행합니다.그런 다음 이 표(클라이언트)의 필드에 올바른 데이터를 입력합니다(MedicalGroupsId에 값이 있음). 키 라을인 키 만 듭 를 니 다 외

[ForeignKey("MedicalGroupId")]
public virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = value; } }

에는 '결는실니다합행에국▁the다니'를 합니다.update-database괜찮을 겁니다.

나는 내 문제의 해결책을 얻었습니다.문제는 제 고객 테이블에 있는 "데이터"입니다.클라이언트 테이블에 실제 존재하지 않는 medicalgroupid 값이 있기 때문에 외부 키 제약 조건에 오류가 발생합니다.

Update Client set MedicalGroupId = NULL

defaultValue set에서도 이 문제가 발생했습니다.

"하나 이상의 개체가 이 열에 액세스하기 때문에 개체가 ALTER TABLE ALTER COLUMEN에 종속되어 있습니다."

결국 AddForeignKey/DropForeignKey를 새 마이그레이션으로 이동하고 별도의 update-database 명령으로 실행했습니다(하나의 명령으로 두 마이그레이션을 모두 실행하지 않음).

    public override void Up()
    {
        CreateTable(
            "dbo.DecisionAccesses",
            c => new
            {
                Id = c.Int(nullable: false),
                Name = c.String(nullable: false, maxLength: 50),
            })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.DecisionPersonStatus",
            c => new
            {
                Id = c.Int(nullable: false),
                Name = c.String(nullable: false, maxLength: 50),
            })
            .PrimaryKey(t => t.Id);

        AddColumn("dbo.DecisionForm_DecisionFields", "DecisionAccessId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
        AddColumn("dbo.DecisionMatterPersons", "DecisionPersonStatusId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
        CreateIndex("dbo.DecisionForm_DecisionFields", "DecisionAccessId");
        CreateIndex("dbo.DecisionMatterPersons", "DecisionPersonStatusId");
        //I moved outcommented to next migration and ran the migrations in separate steps to avoid: (The object is dependent on column ALTER TABLE ALTER COLUMN failed because one or more objects access this column)
        //AddForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses", "Id", cascadeDelete: true); 
        //AddForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus", "Id", cascadeDelete: true);
    }


    public override void Down()
    {
        //Moved to next migration
        //DropForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus");
        //DropForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses");
    }

하위 테이블에 고아 레코드가 있는 경우에도 이 오류가 발생할 수 있습니다.데이터베이스를 정리하면 문제가 해결됩니다.

마이그레이션 순서가 올바르다고 가정합니다. 즉, 외부 키와 연결된 테이블이 참조 전에 만들어집니다.다음 단계를 수행합니다.

  1. SQL Management Studio에서 현재 데이터베이스 백업(필요한 경우)
  2. SQL 관리 스튜디오에서 데이터베이스 삭제
  3. Visual Studio 'Package Manager Console'에서 'Update-Database' 입력

Package Manager 콘솔에서 Add-Migration InitialCreate –IgnoreChanges 명령을 실행합니다.이렇게 하면 현재 모델을 스냅샷으로 사용하여 빈 마이그레이션이 생성됩니다.

Package Manager 콘솔에서 Update-Database 명령을 실행합니다.초기 작성 마이그레이션이 데이터베이스에 적용됩니다.실제 마이그레이션에는 변경 사항이 포함되어 있지 않으므로 __Migrations에 행을 추가하기만 하면 됩니다.이 마이그레이션이 이미 적용되었음을 나타내는 기록 테이블.

자세한 내용은 여기에서 확인할 수 있습니다. https://msdn.microsoft.com/en-us/library/dn579398(v=vs.113).aspx

저도 이 메시지를 받았습니다.문제는 DB의 테스트 데이터가 올바르지 않다는 것이었습니다.테스트할 때 유효성을 검사하지 않았기 때문에 null을 허용하지 않는 필드의 ID에 대한 null 값이 있습니다.일단 데이터를 수정하면 update-database 명령어가 성공적으로 실행되었습니다.

그 문제가 있었지만 다행히도 저는 제 테이블을 만들고 있었습니다.저는 각 테이블에 샘플 항목이 몇 개밖에 없었습니다.두 테이블의 모든 행을 삭제한 후 작동했습니다.나는 바보니까 그만한 가치가 있는 것으로 받아들여요.

다음을 통해 데이터 시드를 사용할 수도 있습니다.

modelBuilder.Entity<MedicalGroups>()
.HasData(new MedicalGroups { ... }, new MedicalGroups { ... })

DbContexts 클래스의 OnModelCreating 메서드에 있습니다.

그러면 참조 테이블에서 ID가 누락된 모든 의료 데이터 행을 삽입할 수 있습니다.적어도 제 경우에는 데이터가 필요하기 전에 시드되어 업데이트 데이터베이스가 제대로 작동했습니다.

언급URL : https://stackoverflow.com/questions/20871349/entity-framework-the-alter-table-statement-conflicted-with-the-foreign-key-const

반응형