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