【问题标题】:Entity Framework Code First: Table Per Hierarchy, doesn't popluate custom discrimiator field实体框架代码优先:按层次结构表,不填充自定义鉴别器字段
【发布时间】:2013-04-09 05:54:00
【问题描述】:

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

【问题讨论】:

    标签: ef-code-first entity-framework-5 .net-4.5 discriminator


    【解决方案1】:

    我本以为会出现“CourseType 不能用作鉴别器,也不能用作映射库”之类的异常(我显然不记得正确的错误消息)。但是CourseType 作为鉴别器时不能作为映射列作为模型的一部分。通常的模式是仅在映射配置中查看它(如您所见)。无处可去。

    因此,如果您从 Course 中删除 CourseType 可能会有所帮助。我希望你不需要它来处理任何其他逻辑。

    【讨论】:

    • 感谢您抽出宝贵时间回答这个问题。我已将迁移更改为从“CourseType”重命名为“Discrimiator”
    • @Gert:那么这里的最终答案是什么?像 Pauly 一样,我有一个预先存在的列需要成为鉴别器。但是,它不是模型类的一部分,仅在 Map 语句中用作必需的列。就像weblogs.asp.net/manavi/… 建议一样。尽管如此,我看到创建了一个描述符列。
    • @one.beat.consumer 嗯,数据库里当然有鉴别器列。它告诉 EF 要创建哪种实体类型。如果您有任何不清楚的地方,请ask a question
    • 您应该在评论之前查看链接。它提供了一个示例,用于显式命名现有数据库架构的数据类型和列名。我问你,专家,它是否有问题,因为它继续创建一个鉴别器列,而不是使用现有的命名列。我不认为一个新问题是合适的,因为它只是对这个问题的更详细的回答。
    • 好吧,@one.beat.consumer,您不太清楚 EF 坚持创建一个具有确切名称“鉴别器”的列。如果您说“鉴别器列”,它也可能是具有鉴别器功能的列。我不知道那里有什么东西坏了。当我重新尝试链接中的代码时它工作正常(我确实阅读过,并且已经知道)。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多