2

Table Per Hierarchy (TPH) アーキテクチャを使用して、既存のデータベース スキーマを操作しています。カスタムDiscriminatorフィールド名を使用しようとすると、 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