我正在使用 Table Per Hierarchy (TPH) 架构来处理现有的数据库模式。当我尝试使用自定义鉴别器字段名称时 DbEntityValidationException:
属性:CourseType 错误:CourseType 字段是必需的。
楷模
public abstract class Course {
public int ID { get; set; }
public string Name { get; set; }
public string CourseType { get; set; }
}
public class OnlineCourse : Course {
public string Url { get; set; }
}
public class OnsiteCourse : Course {
public string Location { get; set; }
}
实体类型配置
public class CourseMap : EntityTypeConfiguration<Course> {
public CourseMap() {
this.HasKey(x => x.ID);
this.Property(x => x.Name).HasMaxLength(100).IsRequired();
this.Property(x => x.CourseType).HasMaxLength(128).IsRequired();
}
}
public class OnlineCourseMap : EntityTypeConfiguration<OnlineCourse> {
public OnlineCourseMap() {
this.Property(x => x.Url).HasMaxLength(500);
}
}
public class OnsiteCourseMap : EntityTypeConfiguration<OnsiteCourse> {
public OnsiteCourseMap() {
this.Property(x => x.Location).HasMaxLength(100);
}
}
数据上下文
public class EntityContext : DbContext {
public EntityContext(): base("Name=EntityContext") {
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Configurations.Add(new CourseMap());
modelBuilder.Configurations.Add(new OnlineCourseMap());
modelBuilder.Configurations.Add(new OnsiteCourseMap());
modelBuilder.Entity<Course>()
.Map<OnlineCourse>(x => x.Requires("CourseType").HasValue("Online"))
.Map<OnsiteCourse>(x => x.Requires("CourseType").HasValue("Onsite"));
}
public DbSet<Course> Courses { get; set; }
}
执行的代码
using (var ctx = new EntityContext()) {
ctx.Courses.Add(new OnlineCourse() {
Name = "Online 1",
Url = "Http://www.online.com"
});
ctx.SaveChanges();
}