C# 实体框架TPH:如何将外键映射到DB列

C# 实体框架TPH:如何将外键映射到DB列,c#,entity-framework,ef-fluent-api,table-per-hierarchy,tph,C#,Entity Framework,Ef Fluent Api,Table Per Hierarchy,Tph,我使用每个层次结构的表模式(所有派生类使用相同的DB表),如下所示: public class Student : Person { public virtual Address Address { get; set; } } public class Teacher : Person { public virtual Address Address { get; set; } } public class Address { public int Id { get

我使用每个层次结构的表模式(所有派生类使用相同的DB表),如下所示:

public class Student : Person
{
    public virtual Address Address { get; set; }
}

public class Teacher : Person
{
    public virtual  Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
}
public class XXX : Person
{
    [Column("AddressId")]
    public virtual int AddressId { get; set; }


    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

}
        modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address)
            .WithRequired(a => (a.Person as Student));
基类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}
一些派生类,其中一些具有地址,如下所示:

public class Student : Person
{
    public virtual Address Address { get; set; }
}

public class Teacher : Person
{
    public virtual  Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
}
public class XXX : Person
{
    [Column("AddressId")]
    public virtual int AddressId { get; set; }


    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

}
        modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address)
            .WithRequired(a => (a.Person as Student));
不幸的是,在创建数据库时,会为每个地址外键创建一个新列,如下所示:
address\u Id
address\u Id1
<代码>地址\u IdN

可以通过使用如下地址向每个类显式添加外键来克服此问题:

public class Student : Person
{
    public virtual Address Address { get; set; }
}

public class Teacher : Person
{
    public virtual  Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
}
public class XXX : Person
{
    [Column("AddressId")]
    public virtual int AddressId { get; set; }


    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

}
        modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address)
            .WithRequired(a => (a.Person as Student));
但是,此解决方案要求类中具有
AddressId
属性,这是不可取的。不能将其隐藏并声明为私有或受保护,因为表映射属性必须是公共的

我曾想过像这样使用fluent API:

public class Student : Person
{
    public virtual Address Address { get; set; }
}

public class Teacher : Person
{
    public virtual  Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
}
public class XXX : Person
{
    [Column("AddressId")]
    public virtual int AddressId { get; set; }


    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

}
        modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address)
            .WithRequired(a => (a.Person as Student));
modelBuilder.Entity()
.has可选(s=>s.Address)
.要求(a=>(a.作为学生的人));

modelBuilder.Entity()
.HasRequired(a=>a.Person)
.with可选(s=>(s作为学生)。地址);
但是在基类和派生类之间进行强制转换存在问题。现在我被卡住了