将层次结构映射到实体框架中不同的表键字段
本文关键字:字段 映射 层次结构 实体 框架 | 更新日期: 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; }