我有一个继承了另一个类与之关系的基类的类。
示例:
没有动物表;动物是一个抽象类。但疫苗接种只知道动物,而不是狗。 (EF,但是,两者都知道。)我将我的类库分开,使得Animal和Vaccination在核心库中,Dog在另一个引用核心库的库中。
当使用实体框架代码优先时,Vaccinations表将获得额外的列:Dog_ID,如Dog类的List< Vaccination>显式声明正在创建推理。因此,该栏将疫苗接种记录映射到狗。这样就可以了,除了我想在多种类型的Animal之间共享这个额外的列。因此,例如,而不是拥有Dog_ID和Cat_ID,我想拥有一个可以加入Dog或Cat的Animal_ID。
由于Animal是抽象的并且没有DB表,我可以使用流畅的语句和/或属性/属性声明来实现这一点吗?
答案 0 :(得分:3)
除非您创建Vaccination
表并与该表建立关系,否则您的Animal
表将始终为每个接种疫苗类型的动物提供额外的FK列。 EF无法映射和关系的高级抽象 - 关系必须遵循相同的规则,就像在数据库中直接创建它们一样。
如果只有一些动物可以接种疫苗,您可以在层次结构中添加另一个表并与该新表建立关系(EF无法使用接口)。您将需要Table per Type映射,这将使当前EF版本中的查询性能更差。
答案 1 :(得分:2)
假设您的所有动物都接种疫苗
public abstract class Animal
{
public string ID { get; set; }
public ICollection<Vaccination> Vaccinations { get; set; }
}
public class Vaccination
{
public string ID { get; set; }
public string AnimalID { get; set; }
public virtual Animal Animal { get; set; }
//other properties
}
然后,您可以继承Cat
和Dog
并使用Table per Type
映射。
答案 2 :(得分:1)