将层次结构映射到实体框架中不同的表键字段

本文关键字:字段 映射 层次结构 实体 框架 | 更新日期: 2023-09-27 18:05:21

朋友们,我再次需要你们的指导。我遇到了EF中的错误:"ORA-00904:"Extent1"。PERSONID":无效标识符"。我有3个类:父类"Person"和子类"PersonLegal"answers"PersonPhysical"简化如下:

class Person {
    int Id;
    type SomeProperty;
}
class PersonPhysical : Person {
    type OtherProperty;
}
class PersonLegal : Person {
    type AnotherProperty;
}

事实上,Oracle抱怨是正确的,因为PERSONPHYSICAL和PERSONLEGAL表不包含PERSONID属性。取而代之的是PERSONPHYSICALID和PERSONLEGALID。Person有PERSONID。我如何告诉EF我想在映射中为那些属性使用不同的列名?

将层次结构映射到实体框架中不同的表键字段

在你的DbContext类重载方法OnModelCreating中使用流畅的API定义映射,并尝试以下代码:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Person");
        });
        modelBuilder.Entity<PersonLegal>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("PersonLegal");
        });
        modelBuilder.Entity<PersonPhysical>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("PersonPhysical");
        });
        modelBuilder.Entity<Person>()
            .Property(t => t.Id)
            .HasColumnName("PERSONID");
        modelBuilder.Entity<PersonLegal>()
            .Property(t => t.Id)
            .HasColumnName("PERSONLEGAL");
        modelBuilder.Entity<PersonPhysical>()
            .Property(t => t.Id)
            .HasColumnName("PERSONPHYSICAL");
        base.OnModelCreating(modelBuilder);
    }

为DbContext类添加3个属性:

public virtual DbSet<Person> People { get; set; }
public virtual DbSet<PersonLegal> PersonLegals { get; set; }
public virtual DbSet<PersonPhysical> PersonPhysicals { get; set; }