EF6中TPT继承映射配置问题:SubService与BaseService关联
解决Entity Framework 6中继承映射的关联列问题
你的场景属于**TPT(每个类型一张表)**继承映射,EF6默认会假设子类表的主键列名和父类一致(都是ID),所以需要显式配置子类表中对应父类主键的列名,让EF使用SubService.BaseServiceID关联BaseService.ID。
正确的配置代码
首先确保实体类结构正确:
public class BaseService { public int ID { get; set; } // 父类其他属性 } public class SubService : BaseService { // 子类专属属性,无需重复定义ID }
然后修改Fluent API配置:
// BaseService 配置 modelBuilder.Entity<BaseService>(e => { e.ToTable("BaseService"); e.HasKey(x => x.ID); }); // SubService 配置 modelBuilder.Entity<SubService>(e => { e.ToTable("SubService"); // 将继承自BaseService的ID属性映射到SubService表的BaseServiceID列 e.Property(x => x.ID).HasColumnName("BaseServiceID"); });
配置说明
e.ToTable("SubService"):明确指定子类对应的数据库表,启用TPT继承策略。e.Property(x => x.ID).HasColumnName("BaseServiceID"):告诉EF,子类继承的ID属性在数据库表中对应的列是BaseServiceID,这样EF就会用这个列和父类的ID列建立关联,而不是默认的ID列。
如果你的SubService实体类中显式定义了BaseServiceID属性(而非依赖继承的ID),可以调整配置如下:
public class SubService : BaseService { public int BaseServiceID { get; set; } // 子类专属属性 } // SubService 配置 modelBuilder.Entity<SubService>(e => { e.ToTable("SubService"); // 指定子类的主键为BaseServiceID e.HasKey(x => x.BaseServiceID); // 将父类的ID属性映射到BaseServiceID列 e.Property(x => x.ID).HasColumnName("BaseServiceID"); });
内容的提问来源于stack exchange,提问作者Kevin O'Donovan
相关产品推荐
相关产品推荐

