簡體   English   中英

EF 4.1父級子代和繼承映射的代碼優先問題

[英]EF 4.1 Code First problem with parent child and Inheritance Mapping

我在繼承映射方面遇到了一些問題,無法使其正確映射到基類,並且在基類的所有字段(元素)上都獲得了一個無效列

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

我收到錯誤消息:

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

您的映射是完全錯誤的。 您的數據庫為每個實體(包括基本實體類型Elements )都有一個單獨的表。 這意味着您必須使用每類型表(TPT)映射,但是您的代碼正在使用每具體表類型(TPC)映射。 TPC要求不存在基本類型的表,而是所有派生實體的表都具有所有基本類型的列。 這就是您選擇該例外的原因。 刪除m.MapInheritedProperties(); 從您所有的孩子映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM