2016-06-27 3 views
0

코드 우선을 사용하여 많은 테이블이있는 데이터베이스가 있습니다. 테이블의 3 이상한 점은 EF가 MachineTypeApproval-Machine에서 외래 키 생성한다는 것입니다Entity Framework 잘못된 속성 관계 만들기

public class Machine 
{ 
    [Key] 
    public long ID { get; set; } 
    ... 
    public virtual MachineTypeApprovalHist MachineTypeApproval { get; set; } 

} 

public class MachineTypeApprovalHist 
{ 
    [Key] 
    public long ID { get; internal set; } 
    ... 
} 

public class MachineTypeApproval 
{ 
    [Key] 
    public long ID { get; set; } 
    ... 
} 

있습니다 (하지 MachineTypeApprovalHist 예상대로를!). 오랜 시간 동안 디버깅을 한 후에 데이터베이스 테이블을 직접보고 테이블 간의 관계를 확인했습니다. 내가 가진 오류는

입니다. UPDATE 문은 FOREIGN KEY 제약 조건 "FK_dbo.Machines_dbo.MachineTypeApprovals_MachineTypeApproval_ID"와 충돌합니다. 데이터베이스 "ATPData", 테이블 "dbo.MachineTypeApprovals", 열 'ID'에서 충돌이 발생했습니다. 명세서가 종료되었습니다.

MachineTypeApprovalHist의 ID가 MachineTypeApprovals이 아니므로 오류가 발생합니다.

MachineTypeApproval 속성의 이름을 TypeApproval로 바꾸고 새 마이그레이션을 시도했지만 테이블 열과 인덱스의 이름 만 변경했습니다.

데이터를 잃어 버릴 수 있으므로 데이터베이스를 처음부터 다시 만들 수 없으므로이를 해결하려면 어떻게해야합니까?

+0

한 번이 문제가 발생하여이 링크가 도움이되었습니다. https : // msdn. microsoft.com/en-us/data/jj713564.aspx –

+0

다른 탐색 속성이 있습니까? AFAIK, 일대일 관계의 경우 EF는 PK = FK 관계를 사용하므로 추가 외래 키를 생성하지 않습니다. – DevilSuichiro

+0

@ OffirPe'er, 링크에서 기사를 읽었습니다. 어떤 부분이 도움이 되었습니까? – smok

답변

0

나는,이 문제를 해결하는 방법을 발견했다.

내가 한 방법은 내 Machine 클래스에 다른 속성을 추가하여 첫 번째 속성을 바꾸는 것이 었습니다.

public class Machine 
{ 
    [Key] 
    public long ID { get; set; } 
    ... 
    public virtual MachineTypeApprovalHist MachineTypeApproval { get; set; } 

    //new property 
    public virtual MachineTypeApprovalHist TypeApproval {get; set;} 
} 

그런 다음 올바른 테이블에 외래 키가있는 새 열을 생성하는 새로운 마이그레이션을 만들었습니다.

이제 데이터를 잃어 버리기 때문에 원본 속성을 제거하고 데이터베이스를 업데이트 할 수 없습니다. 그래서 일단 내가 그 마이그레이션 위로 방법 첫 번째 마이그레이션이 제대로 생성이 방법으로 다른 전화

Sql("update [dbo].Machines set TypeApproval_ID = MachineTypeApproval_ID "); 

전에 첫 번째 줄에 다음에 추가, 새로운 마이그레이션을 추가, Machine 클래스에서 원래의 특성 MachineTypeApproval을 제거 두 번째 마이그레이션은 이전 열의 데이터를 새로운 열로 복사하고, 두 번째 마이그레이션은 이전 열을 제거하고 내 모델과 db는 이제 올바른 것입니다.

이 작업을 수행하려면 두 가지 마이그레이션이 필요하다는 점만 싫어합니다. 또한 EF는 어떤 테이블을 사용할 지 결정하기 위해 속성 유형을 사용하기 전에 속성 이름을 사용하는 것처럼 보입니다. 내게 완전히 미친 것처럼 보입니다.

0
public class DatabaseContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder 
      .Entity<Machine>() 
      .HasOptional(_ => _.MachineTypeApproval) 
      .WithMany(); 
    } 
} 

다음 SQL 문을 생성합니다 : 나는 그것이 쉬울한다고 생각하지만

ALTER TABLE [dbo].[Machines] WITH CHECK ADD CONSTRAINT [FK_dbo.Machines_dbo.MachineTypeApprovalHists_MachineTypeApproval_ID] FOREIGN KEY([MachineTypeApproval_ID]) 
REFERENCES [dbo].[MachineTypeApprovalHists] ([ID]) 
GO 

ALTER TABLE [dbo].[Machines] CHECK CONSTRAINT [FK_dbo.Machines_dbo.MachineTypeApprovalHists_MachineTypeApproval_ID] 
GO 
+0

탐색 속성이 필요하지 않습니까? nullable/optional을 유지해야합니다. – smok

+0

.HasOptional (...) –

+0

은 내 OnModelCreating에 제안을 추가 한 다음 새 마이그레이션을 만들려고했지만 빈 위/아래 메서드 만 생성합니다. – smok

관련 문제