2016-11-23 1 views
0

테이블 당 구체적인 유형 (TPC) 매핑을 사용하는 테이블 계층 구조가 있습니다. (I 확실하지 [키, 칼럼] 속성은 작동합니다 것 필요하지만 https://stackoverflow.com/a/19792915/959779에 따라 있음)EF6에서 복합 키를 사용한 테이블 당 구체적인 유형 (TPC) 매핑

클래스 구조 :

public abstract class BaseEntity 
{ 
    [Key, Column(Order = 0)] 
    public int Id { get; set; } 
} 
public class Page: BaseEntity { 
    string Data { get; set; } 
} 
public class PageBackup: Page { 
    [Key, Column(Order = 1)] 
    public int PageId { get; set; } 
    public virtual Page Page { get; set; } 
} 

PagePageBackup 기관의 Id 테이블에 추가 한 후 (교 차 있습니다 일부 항목) EF는 고유 한 기본 키를 가지고 있어야합니다 EntitySet 'EUICDataContext.Pages'의 다음 큐션에게

"모든 객체를 throw합니다. 을하지만,을 'Entities.PageBackup'유형의 인스턴스와 'Entities.Page'유형의 인스턴스는 모두 'EntitySet = Pages; Id = 6'과 동일한 기본 키 값을 갖습니다. 아래의 "

엔티티 매핑 코드 :

class PageMapping : EntityTypeConfiguration<Page> 
{ 
    public PageMapping() 
    { 
     Map(m =>{ m.ToTable("Page"); }); 
     HasKey(t => t.Id }); 
    } 
} 

class PageBackupMapping : EntityTypeConfiguration<PageBackup> 
{ 
    public PageBackupMapping() 
    { 
     Map(m =>{ 
      m.MapInheritedProperties(); 
      m.ToTable("PageBackup"); 
     }); 
     HasKey(t => new { t.Id, t.PageId }); 
    } 
} 

문제는 EF에 PageMapping 다음 서명 테이블을 생성 복합 키 Update-Database 씨앗 스크립트를 가지고 있지만입니다 :

CREATE TABLE [dbo].[PageBackup](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [PageId] [int] NOT NULL, 
    [Data] [nvarchar](max) NULL, 
    CONSTRAINT [PK_dbo.PageBackup] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC 
    ) 

는 EF 허용인가 복합 키가있는 테이블을 만들려면 (매핑이있는 많은 예제가 있지만 마이그레이션에 대해 찾지 못했습니다)

TPC 매핑 대신 이러한 구성을 설명하는 방법은 무엇입니까?

다른 해결책 제안이 도움이 될 것입니다.

답변

1

나는 그걸로 놀고있어,이 사건은 EF 6에서 지원하지 않는 것 같습니다. ID 마이 그 레이션은 ID 기본 키로 자동 생성됩니다.

CreateTable(
      "dbo.PageBackUp", 
      c => new 
       { 
        Id = c.Int(nullable: false), 
        PageId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

나는 이것을 EF Core 1.1.0에서 관리하려고합니다. 이 경우에 오류가 발생했습니다.

파생 된 유형이기 때문에 '페이지'에 키를 구성 할 수 없습니다. 키는 루트 유형 'BaseEntity'에 구성되어야합니다. 모델에 'BaseEntity'를 포함시키지 않으려면 이 컨텍스트의 DbSet 속성에 포함되어 있지 않고 ModelBuilder를 구성 호출에서 참조하거나 탐색 속성에서 참조해야합니다. 모델에 포함 된 유형.

이것이 Entity Framework의 한계라고 생각합니다. 이 질문으로 EF repo에 문제를 제기 할 수 있습니다.

내 EF 핵심 구성했다 :

public class ProductContext : DbContext 
{ 
    public ProductContext() 
    { 

    } 
    public ProductContext(DbContextOptions<ProductContext> options) 
     : base(options) 
    { } 

    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder builder) 
    { 
     builder.UseSqlServer("Data Source=.\\sqlexpress;"); 
     base.OnConfiguring(builder); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .HasBaseType<BaseEntity>() 
      .ToTable("Page") 
      .HasKey(t => t.Id); 

     modelBuilder.Entity<PageBackup>() 
      .HasBaseType<Page>() 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

EF 6 버전 :

public class ProductContext : DbContext 
{ 
    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .Map(m => m.MapInheritedProperties().ToTable("Page")) 
      .HasKey(t => t.Id); 


     modelBuilder.Entity<PageBackup>() 
      .Map(m => m.MapInheritedProperties().ToTable("PageBackUp")) 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
}