首页 文章

EF Code First抽象关系?

提问于
浏览
4

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

例:

  • 基类:动物

  • 子类1:狗

  • 子类2:猫

  • 相关的一对多表:接种疫苗

  • 一只狗可以多次接种疫苗 . 这是作为List <Vaccination>实现的 .

  • 一只猫可以多次接种疫苗 .

  • 疫苗接种记录只能有一只与之相关的动物 .

  • 疫苗接种与狗或猫无关 . (狗和猫使用非碰撞的GUID . )

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

当使用Entity Framework Code First时,Vaccinations表正在获取额外的列:Dog_ID,因为Dog类的List <Vaccination>显式声明正在创建推理 . 因此,该栏将疫苗接种记录映射到狗 . 这样就可以了,除了我希望在多种类型的Animal之间共享这个额外的列 . 所以例如,而不是拥有Dog_ID和Cat_ID我想拥有一个可以加入Dog或Cat的Animal_ID .

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

3 回答

  • 2

    因此,当我实现当前标记为答案的内容时(我最终需要继续创建Animal表)我遇到了问题,因为正如我在我的问题中所解释的那样,我有一个孤立的项目,声明"Dog",为此以及我指示的相关问题hereherehere .

  • 1

    除非您创建 Animal 表并与该表 Build 关系,否则您的 Vaccination 表将始终为每个接种疫苗类型的动物提供额外的FK列 . EF无法映射和关系的高级抽象 - 关系必须遵循相同的规则,就像在数据库中直接创建它们一样 .

    如果只有一些动物可以接种疫苗,您可以将另一个表添加到层次结构并与该新表 Build 关系(EF不能与接口一起使用) . 您将需要Table per Type映射,它将使您的查询性能在当前的EF版本中更糟糕 .

  • 3

    假设你的所有动物都接种了疫苗

    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 映射 .

相关问题