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将它们作为独立实体处理:
- 修改父类
PROCESSCARD,添加表映射特性:
[Table("PROCESSCARD")] public class PROCESSCARD : BaseClass { // 原有代码保持不变 }
- 修改子类
PROCESS_CARD_HIST,添加历史表映射特性:
[Table("PROCESSCARD_HIST")] public class PROCESS_CARD_HIST : PROCESSCARD { // 空类无需额外代码 }
完成上述修改后,EF会将两个类分别映射到各自的独立表,不会自动生成Discriminator列,问题即可解决。
内容的提问来源于stack exchange,提问作者Vimal Upadhyay
相关产品推荐
相关产品推荐

