EF Code First抽象关系?

时间:2011-07-05 07:43:02

标签: entity-framework-4.1 abstract-class ef-code-first code-first

我有一个继承了另一个类与之关系的基类的类。

示例:

  • 基类:动物
  • 子类1:狗
  • 子类2:猫
  • 相关的一对多表格:接种疫苗
    • 狗可以多次接种疫苗。这被实现为List< Vaccination>。
    • 猫可以多次接种疫苗。
    • 疫苗接种记录只能有一只与之相关的动物。
    • 疫苗接种不知道它是否与狗或猫有关。 (狗和猫使用非碰撞的GUID。)

没有动物表;动物是一个抽象类。但疫苗接种只知道动物,而不是狗。 (EF,但是,两者都知道。)我将我的类库分开,使得Animal和Vaccination在核心库中,Dog在另一个引用核心库的库中。

当使用实体框架代码优先时,Vaccinations表将获得额外的列:Dog_ID,如Dog类的List< Vaccination>显式声明正在创建推理。因此,该栏将疫苗接种记录映射到狗。这样就可以了,除了我想在多种类型的Animal之间共享这个额外的列。因此,例如,而不是拥有Dog_ID和Cat_ID,我想拥有一个可以加入Dog或Cat的Animal_ID。

由于Animal是抽象的并且没有DB表,我可以使用流畅的语句和/或属性/属性声明来实现这一点吗?

3 个答案:

答案 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
}

然后,您可以继承CatDog并使用Table per Type映射。

答案 2 :(得分:1)

因此,当我实施当前标记为答案的内容(我最终需要继续创建Animal表格)时,我遇到了问题因为,正如我在我的问题中所解释的那样,我有一个孤立的项目,声明“狗” “,对于这个及相关问题,我的导演是hereherehere