2

나는 내 도메인 모델 나는 추상적이며, 세 가지 다른 회사 유형은 회사의 서브 클래스로 표시되는 Company 기본 클래스가 : 같은 방법으로EF-마이그레이션 FK 오류

public abstract class Company 
{ 
    public int Id { get; set; } 
    ... 
} 

public class Supplier : Company 
{ 
    ... 
} 

public class Dealer : Company 
{ 
    public DealerFundsAccount FundsAccount { get; set; } 
    ... 
} 

public class Retailer : Company 
{ 
    public RetailerFundsAccount FundsAccount { get; set; } 
    ... 
} 

을 , 나는 기금 계정 및 특정 속성을 구현하는 두 가지 하위 유형을 정의하는 또 다른 기본 클래스가 있습니다

public abstract class FundsAccount 
{ 
    public int Id { get; set; } 
    ... 
} 

public class DealerFundsAccount : FundsAccount 
{ 
    public Dealer Dealer { get; set; } 
    ... 
} 

public class RetailerFundsAccount : FundsAccount 
{ 
    public Retailer Retailer { get; set; } 
    ... 
} 

나는 단지에 대한 DbSets을 정의 테이블 당 계층 구조 내 DbContext 클래스 있도록 이러한 유형에 대한 나의 매핑 전략이다 기본 클래스, w HICH 모두 다형성과 비 다형성 쿼리를 수행 할 날 수 있습니다 :

public DbSet<Company> Companies { get; set; } 
public DbSet<FundsAccount> FundsAccounts { get; set; } 

이제 까다로운 부분 온다, 내 요구 사항은 그 상태 :

  • 공급 자금이
  • 계정이없는합니다 딜러는 DealerFundsAccount가 있어야합니다.
  • 소매 업체는 소매 업체가 있어야합니다.

그것은이 간단해야한다 :

modelBuilder.Entity<Retailer>() 
    .HasRequired(r => r.FundsAccount) 
    .WithRequiredDependent(rfa => rfa.Retailer); 

modelBuilder.Entity<Dealer>() 
    .HasRequired(d => d.FundsAccount) 
    .WithRequiredDependent(dfa => dfa.Retailer); 

그러나 EF 마이그레이션 비참 데이터베이스 스키마를 업데이트하려고 실패. TPH로 인해 RetailerFundsAccounts 및 DealerFundsAccounts가 모두 FundsAccount db 테이블에 매핑되는 동안 Dealer 및 Retailers는 동일한 회사 데이터베이스 테이블에 매핑되지만 하위 유형간에 두 개의 일대일 관계를 정의했기 때문에 EF 은 FundsAccount Id 필드의 외래 키를 두 번으로 정의하십시오.

자금 계정이있는 회사 테이블 각각에 대해 일대 다 관계를 정의하여 솔루션을 해킹 할 수 있음을 알고 있습니다. 고유 한 제약 조건을 사용하는 일대 다 행동을 FK로 막지 만, 더 나은 해결책이 있는지 확인하십시오.

+0

아무도 없습니까? 이 문제가 마이그레이션 문제라고 생각하기 시작했습니다. 새로운 솔루션에서 문제를 재현하려고 시도했지만 오류가 없습니다. –

답변

0

EF 마이그레이션이 잘못되었다고 밝혀졌습니다. 나는 처음부터 데이터베이스 스키마를 만들려고하면, 모든 것이 괜찮지 만, 당신이이 엔티티를 추가 마이그레이션을 만들 경우, EF는 다음과 같이 두 번 지수와 외래 키를 만들 시도하여 실패

 CreateTable(
      "dbo.FundsAccount", 
      c => new 
       { 
        Id = c.Int(nullable: false), 
        Discriminator = c.String(nullable: false, maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Company", t => t.Id) 
      .ForeignKey("dbo.Company", t => t.Id) // duplicate 
      .Index(t => t.Id) 
      .Index(t => t.Id); // duplicate 

을 솔루션은 이주 된 내용을 편집하여 중복 된 FK 및 색인 항목을 제거하는 것입니다.

또한 문제의 제목을 더 잘 설명하기 위해 업데이트 할 예정입니다.