2

我正在使用 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();
}
4

1 回答 1

4

我本来预计会有一个例外,例如“CourseType 不能用作鉴别器,也不能用作映射库”(我显然不记得正确的错误消息)。但是CourseType当它是判别器时,不能作为映射列作为模型的一部分。通常的模式是仅在映射配置中查看它(如您所见)。无处。

因此,如果您CourseTypeCourse. 我希望你不需要它来处理任何其他逻辑。

于 2013-04-09T06:17:35.790 回答