0

이것은 this question의 확장이며 이제는 EF6에서 작동합니다. 그러나 공유 및 비공유 속성을 모두 가진 하위 클래스가있을 때 문제가있는 것처럼 보입니다. 공유 테이블과 비공유 열 모두를 사용하는 계층 구조 테이블 매핑

이의이 내 모델 설정되어 있다고 가정 해 봅시다 : 데이터베이스에서

public abstract class Document 
{ 
    public int Id { get; set; } 
    public string NameOnDocument { get; set; } 
} 

public class BirthCertificate : Document 
{ 
    public string RegistrationNumber { get; set; } 
} 

public class Licence : Document 
{ 
    public string LicenceNumber { get; set; } 
} 

, 나는 동일한 열, Number를 공유 할 수 BirthCertificate.RegistrationNumberLicence.LicenceNumber를 원한다. 나는 데이터베이스를 생성 할 때 그 모든 모습을

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    // Document - base class 
    modelBuilder.Entity<Document>().HasKey(d => d.Id); 
    modelBuilder.Entity<Document>() 
     .Property(d => d.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    modelBuilder.Entity<Document>() 
     .Property(d => d.NameOnDocument) 
     .HasColumnName("Name"); 

    // Birth certificate 
    modelBuilder.Entity<Document>().Map<BirthCertificate>(map => 
     map.Property(c => c.RegistrationNumber).HasColumnName("Number")); 

    // Licence 
    modelBuilder.Entity<Document>().Map<Licence>(map => 
     map.Property(l => l.LicenceNumber).HasColumnName("Number")); 
} 

을 예상대로 작동합니다 : 따라서,이 같은 내 모델을 설정하고있어

DB Model

을 이제 손에서 문제에 대한. Licence 엔티티도 만료 날짜를 기록해야한다고 가정 해 보겠습니다. 내가 같이가 다음 것을 추가 : 나는 데이터베이스를 다시 생성 할 때

public class Licence : Document 
{ 
    public string LicenceNumber { get; set; } 
    public DateTime ExpiryDate { get; set; } 
} 

는 지금, 그것은 다음과 같습니다 무엇

enter image description here

더, 나는 라이센스 및 출생 증명서를 삽입하려고하면

유형 'System.Data.Entity.Infrastructure.DbUpdateException'의 처리되지 않은 예외가 EntityFramework.dll

012에서 발생, 나는 다음과 같은 예외가

추가 정보 : 엔티티 또는 연결에서 공유되는 값은 둘 이상의 위치에서 생성됩니다. 매핑이 EntityKey를 여러 저장소 생성 열로 분할하지 않는지 확인하십시오.

데이터베이스가 쓸모 없기 때문에 예외가 발생하는 이유를 알 수 있습니다.

내가 무엇을 놓쳤는가?

답변

0

좋아, 문제는 해결하기 쉽다는 것을 알았지 만 내가 말할 수있는 한 어디에도 문서화되어 있지 않다. 그래서 이것은 같은 문제를 가진 누군가를 도울 것입니다. 내가 기대하는 모든 바로 세계와 같이

modelBuilder.Entity<Document>().Map<Licence>(map => 
{ 
    map.Property(l => l.LicenceNumber).HasColumnName("Number"); 
    map.Property(l => l.ExpiryDate).HasColumnName("ExpiryDate"); 
}); 

지금 내 데이터베이스가 생성

겉으로 키는 파생 실체에 마다 속성을 매핑해야 것입니다.

0

데이터베이스에 2 개의 열을 넣으면 많은 것을 얻지 못할지 모르겠습니다. 나는 많은 공간을 절약 할 수 있다고 생각하지 않으며 DocumentNumber을 조회 할 수 없습니다. Number 필드를베이스에 추가하고 재정의에 데이터 주석을 사용하는 것을 고려 했습니까?

public abstract class Document 
{ 
    public int Id { get; set; } 
    public string NameOnDocument { get; set; } 
    public virtual string Number 
} 

public class BirthCertificate : Document 
{ 
    [Display(Name="Registration Number"] 
    [Required] 
    public override string Number { get; set; } 
} 

public class Licence : Document 
{ 
    [Display(Name="Licence Number"] 
    [Required] 
    public override string Number { get; set; } 
} 

편집 그리고 모든 문서 번호가되지 않는 경우 :이 약 6 문서 유형이 실제로있다 ...하지만 더 큰 문제의 예를 제거했다

public abstract class Document 
{ 
    public int Id { get; set; } 
    public string NameOnDocument { get; set; } 
} 

public abstract class NumberedDocument : Document 
{ 
    public virtual string Number 
} 

public class BirthCertificate : NumberedDocument 
{ 
    [Display(Name="Registration Number"] 
    [Required] 
    public override string Number { get; set; } 
} 
+0

하는 각 주에 대한 5 개의 공통 속성과 소수의 반 공통 속성. 모든 서류에 번호가있는 것은 아닙니다. 생각해 줘서 고마워. – gerrod

+0

@gerrod가 "semi-common"속성에 상속을 사용하는 방법을 보여주기 위해 편집했습니다. – Colin

+0

Thanks; 그러나 그것은 여전히 ​​너무 단순합니다 :-). 공통 속성과 함께 사용하면 내 테이블에는 PropertyA, PropertyB ... PropertyG 등 7 개의 공유 속성이 있습니다. Document1에는 PropertyA, PropertyC가 있습니다. Document2에는 PropertyC, PropertyE, PropertyF가 있습니다. Document3에는 PropertyB, PropertyE, PropertyG가 있습니다. 기타 등 서로 다른 6 가지 문서 유형으로 각각 공유 속성의 조합이 다릅니다. – gerrod

관련 문제