我正在使用 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>