You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET EF Core继承实体类访问历史表遇'Discriminator列无效'问题

问题描述

现有直接映射SQL Server数据库表的实体类PROCESSCARD,继承自BaseClass:

public class PROCESSCARD : BaseClass
{
    [Key]
    [Display(Name = "Card No")]
    public String ProcessCardID { get; set; }
    [Display(Name = "Entry Date")]
    public DateTime EntryDate { get; set; }

    [Display(Name ="Job Type")]
    public String JobType { get; set; }

    [Display(Name = "Job / Non Job")]
    public String JobNonJob { get; set; }

    [Display (Name = "Cost Booking")]
    public String CostBooking { get; set; }

    [Display(Name = "Planned Hrs/Qty")]
    public Decimal? PlannedHours { get; set; }
}

基类BaseClass代码:

public class BaseClass
{
    [NotMapped]
    public String StatusMessage { get; set; }
}

为复用代码,创建继承PROCESSCARD的PROCESS_CARD_HIST类映射历史表:

public class PROCESS_CARD_HIST : PROCESSCARD
{

}

访问PROCESS_CARD_HIST数据时,抛出错误:Invalid column name 'Discriminator'

解决方案

原因

Entity Framework默认采用**Table-Per-Hierarchy(TPH,单表映射整个继承层次)**的继承映射策略,会自动在表中添加Discriminator列区分不同子类。但此场景中两个类对应独立数据库表,不需要该区分列,因此触发错误。

解决步骤

给父类和子类分别添加[Table]特性,明确指定各自对应的数据库表,强制EF将它们作为独立实体处理:

  1. 修改父类PROCESSCARD,添加表映射特性:
[Table("PROCESSCARD")]
public class PROCESSCARD : BaseClass
{
    // 原有代码保持不变
}
  1. 修改子类PROCESS_CARD_HIST,添加历史表映射特性:
[Table("PROCESSCARD_HIST")]
public class PROCESS_CARD_HIST : PROCESSCARD
{
    // 空类无需额外代码
}

完成上述修改后,EF会将两个类分别映射到各自的独立表,不会自动生成Discriminator列,问题即可解决。

内容的提问来源于stack exchange,提问作者Vimal Upadhyay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:05:19