1

我正在使用 Table-Per-Hierarchy 模式(所有派生类的相同 DB 表),如下所示:

基类:

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; }
}

不幸的是,在创建数据库时,会为每个地址外键创建一个新列,如下所示:Address_Id, Address_Id1...Address_IdN

可以通过使用 Address 向每个类显式添加外键来克服它,如下所示:

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


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

}

但是,此解决方案需要AddressId在类中具有不受欢迎的属性。它不能隐藏声明为私有或受保护,因为表映射属性必须是公共的。

我想过像这样使用流利的API:

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

或者

        modelBuilder.Entity<Address>()
                    .HasRequired(a => a.Person)
                    .WithOptional(s => (s as Student).Address);

但是基类和派生类之间的转换存在问题。现在我被卡住了……</p>

4

0 回答 0