1

我遇到了繼承映射的一些問題,我無法得到它映射正確的基類,並得到一個無效列所有字段基類(元)EF 4.1代碼與父子代和繼承映射的第一個問題

項目WOS之前,我們從CTP5升級到4.1和工作,其中使用.IsIndependent()

我的代碼如下所示:

表結構:

CREATE TABLE [dbo].[elements](
    [elementID] [uniqueidentifier] NOT NULL, 
    [elementElementID] [uniqueidentifier] NULL, 
    [name] [nvarchar](50) NOT NULL, 
    [solutionID] [int] NOT NULL, 
    [elementTypeID] [int] NOT NULL, 
    [dateCreate] [datetime] NOT NULL, 
    [dateChange] [datetime] NOT NULL, 
    [placeholderNumber] [int] NULL 
) 

CREATE TABLE [dbo].[elementRoots](
    [elementID] [uniqueidentifier] NOT NULL, 
    [allowsiteCounts] [int] NOT NULL 
) 


CREATE TABLE [dbo].[elementSites](
    [elementID] [uniqueidentifier] NOT NULL, 
    [languageCode] [nvarchar](5) NOT NULL 
) 


CREATE TABLE [dbo].[elementPages](
    [elementID] [uniqueidentifier] NOT NULL, 
    [elementMasterID] [uniqueidentifier] NULL, 
    [title] [nvarchar](50) NOT NULL, 
    [desciption] [nvarchar](255) NULL, 
    [path] [nvarchar](512) NULL, 
) 

映射;

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"); 
    }); 
} 

錯誤消息我recive:

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 2014-01-17 05:26:22