首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF码第一抽象关系?

EF码第一抽象关系?
EN

Stack Overflow用户
提问于 2011-07-05 07:43:02
回答 3查看 1.9K关注 0票数 4

我有一个类,它继承了另一个类具有关系的基类。

示例:

  • 基类:动物
  • 第1子类:狗
  • 第2类:禁止酷刑委员会
  • 相关的一对多表:疫苗接种
    • 一只狗可以多次接种疫苗。这是作为一个列表实现的。
    • 一只猫可以接种多种疫苗。
    • 疫苗接种记录只能有一种与之相关的动物。
    • 疫苗接种不知道是与狗还是猫有关。(狗和猫使用非碰撞的GUID。)

没有动物表;动物是一个抽象类。但疫苗接种只了解动物,而不了解狗。(然而,EF对两者都很了解。)我的类库被分割,动物和疫苗接种在一个核心库中,而Dog在另一个引用核心库的库中。

当首先使用实体框架代码时,疫苗接种表将获得额外的列: Dog_ID,因为Dog类的List显式声明正在创建一个推论。因此,这一栏将疫苗接种记录映射到狗身上。这将是很好的,除了我想分享这个额外的列跨多种类型的动物。因此,与其拥有一个Dog_ID和一个Cat_ID,我更希望有一个可以加入到Dog_ID的Animal_ID。

由于property是抽象的,并且没有DB表,所以我可以使用fluent语句和/或属性/属性声明来完成这个任务吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-05 08:09:16

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

如果只有一些动物可以接种疫苗,那么您可以在层次结构中添加另一个表,并与该新表建立关系(EF无法处理接口)。为此您将需要每种类型表映射,这将使您的查询在当前EF版本中的性能更差。

票数 3
EN

Stack Overflow用户

发布于 2011-07-05 07:53:09

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-07-08 07:16:43

因此,当我实现了当前标记的答案(我最终需要继续创建那个动物表)时,我遇到了问题,因为正如我在我的问题中解释的那样,我有一个单独的项目声明"Dog",对于这个和相关的问题,我被指示为这里这里这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6579362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档