엔티티 프레임워크 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에 대한 올바른 값으로 변경했다고 가정할 경우 모델을 수정합니다.따라서 모델 마이그레이션에 중단 없는 체인이 제공됩니다.데이터 모델 변경의 흐름이 그대로 유지되므로 나중에 라이브 사이트에 게시할 때 유용합니다.
- 이게 도움이 되길 바랍니다.
이 오류는 외부 키 제약 조건을 위반하고 있음을 알려줍니다.몇 가지 해결 방법이 있습니다.
- 데이터 수정 - 어딘가에 레코드가 있습니다.
Clients
에 존재하지 않는 MedicalGroupId를 가진 테이블MedicalGroups
table.하여 '아이디'에 아이디가 합니다.MedicalGroups
직접 데이터를 테이블에 올려 수동으로 수정할 수 있습니다. - 외부 키 제약 조건 제거 - 외부 키 제약 조건을 제거하면 더 이상 이 메시지에 영향을 받지 않습니다.유감스럽게도 데이터베이스는 더 이상 이 관계를 적용하지 않으며 나중에 이 문제를 더 악화시킬 수 있습니다.
- 다음을 사용하여 제약 조건 만들기 - 다음을 사용하여 외부 키 제약 조건을 만들 수 있습니다.
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");
}
하위 테이블에 고아 레코드가 있는 경우에도 이 오류가 발생할 수 있습니다.데이터베이스를 정리하면 문제가 해결됩니다.
마이그레이션 순서가 올바르다고 가정합니다. 즉, 외부 키와 연결된 테이블이 참조 전에 만들어집니다.다음 단계를 수행합니다.
- SQL Management Studio에서 현재 데이터베이스 백업(필요한 경우)
- SQL 관리 스튜디오에서 데이터베이스 삭제
- 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
'programing' 카테고리의 다른 글
"Fire and Forget" python 비동기/대기 (0) | 2023.07.17 |
---|---|
새로운 tf.contrib은 어떻습니까?TensorFlow의 요약 요약을 평가하시겠습니까? (0) | 2023.07.17 |
GPU에서 케라스 모델을 실행할 수 있습니까? (0) | 2023.07.17 |
Firebase용 Cloud Functions에서 서버 타임스탬프를 가져오려면 어떻게 해야 합니까? (0) | 2023.07.12 |
쿼리로 인해 CPU 활용률이 높아지고 지연 시간이 길어짐 (0) | 2023.07.12 |