1

상속 매핑에 문제가 발생하여 기본 클래스에 올바르게 매핑 할 수없고 이 표시됩니다. 모든 필드에 잘못된 열이 있습니다. 기본 클래스 (요소)EF 4.1 코드 부모 자식 및 상속 매핑의 첫 번째 문제

우리는 4.1로 CTP5에서 업그레이드하기 전에 작업 프로젝트 WOS를 .IsIndependent()이 같은

내 코드 조회하여 여기서

테이블 구조 :

매핑;

public DbSet<Element> Elements { get; set; } 
public DbSet<ElementRoot> ElementRoots { get; set; } 
public DbSet<ElementSite> ElementSites { get; set; } 
public DbSet<ElementPage> ElementPages { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 


    modelBuilder.Entity<Element>().HasKey(x => x.elementId); 

    modelBuilder.Entity<Element>() 
     .HasOptional(s => s.Parent) 
     .WithMany(c => c.Children) 
     .HasForeignKey(s => s.elementElementId); 

     modelBuilder.Entity<Element>().ToTable("elements"); 

    modelBuilder.Entity<ElementRoot>().Map(m => 
    { 

     m.MapInheritedProperties(); 
     m.ToTable("elementRoots"); 

    }); 

    modelBuilder.Entity<ElementSite>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("elementSites"); 

    }); 

    modelBuilder.Entity<ElementPage>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("elementPages"); 
    }); 
} 

오류 메시지는 내가 받아 봐 :

Invalid column name 'solutionID'. 
Invalid column name 'name'. 
Invalid column name 'solutionID'. 
Invalid column name 'elementTypeID'. 
Invalid column name 'dateCreate'. 
Invalid column name 'dateChange'. 
Invalid column name 'elementElementId'. 
Invalid column name 'placeholderNumber'. 
Invalid column name 'solutionID'. 
Invalid column name 'name'. 
Invalid column name 'solutionID'. 
Invalid column name 'elementTypeID'. 
Invalid column name 'dateCreate'. 
Invalid column name 'dateChange'. 
Invalid column name 'elementElementId'. 
Invalid column name 'placeholderNumber'. 
Invalid column name 'solutionID'. 
Invalid column name 'name'. 
Invalid column name 'solutionID'. 
Invalid column name 'elementTypeID'. 
Invalid column name 'dateCreate'. 
Invalid column name 'dateChange'. 
Invalid column name 'elementElementId'. 
Invalid column name 'placeholderNumber'.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2030802 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5009584 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +86 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10 
    System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443 

답변

1

당신의 매핑이 완전히 잘못된 것입니다. 데이터베이스에는 각 엔티티에 대한 별도의 테이블이 있습니다 (기본 엔티티 유형 Elements 포함). 즉, Table-per-Type (TPT) 매핑을 사용해야하지만 코드가 Table-Per-Concrete Type (TPC) 매핑을 사용한다는 의미입니다. TPC에서는 기본 유형에 대한 테이블이 존재하지 않고 모든 파생 엔티티에 대한 테이블이 모든 기본 유형의 컬럼을 가지고 있어야합니다. 그것이 예외에 해당하는 이유입니다. 모든 하위 매핑에서 m.MapInheritedProperties();을 삭제하십시오.

+0

즉,'MapInheritedProperties'는 TPC를 의미합니다. – Sam