Entity Framework类继承时提示Invalid column name 'Discriminator'错误如何解决
你遇到的问题是Entity Framework默认采用**TPH(每层结构一个表)**的继承映射策略导致的,默认情况下EF会将存在继承关系的多个实体类映射到同一张数据库表,通过额外的Discriminator字段区分实体类型,因此你访问主表TimeMaster时,EF会尝试关联派生类BTimeMaster的映射逻辑,出现冲突报错。
你不需要给BTimeMaster加[NotMapped]标记,采用以下两种方案任选其一即可:
- 方案一(更适配你分Context的场景):在主表对应的
TimetableContext的OnModelCreating方法中,显式忽略派生类BTimeMaster的映射,代码如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 主库上下文不需要感知备份实体的存在 modelBuilder.Ignore<BTimeMaster>(); }
这个方案不会影响备份库BackupContext对BTimeMaster的映射逻辑,AcademicYear字段的映射关系可以完全保留,两边的访问逻辑都能正常运行。
- 方案二(显式指定表映射):分别给两个实体类添加
[Table]特性,显式指定各自映射的数据库表,告诉EF采用TPT(每个类型一个表)的映射策略:
// 主实体类添加 [Table("TimeMaster")] public class TimeMaster { public string parameter1 { get; set; } public string parameter2{ get; set; } public string parameter3 { get; set; } } // 备份实体类添加 [Table("BTimeMaster")] public class BTimeMaster : TimeMaster { [Required(ErrorMessage = "Required!")] [DisplayName("AcademicYear")] public string AcademicYear { get; set; } }
这样EF会将两个类分别映射到独立的两张表,不会出现映射冲突。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

