【问题标题】:EF Code First Mapping Multiple Classes to One TableEF Code First 将多个类映射到一个表
【发布时间】:2011-07-26 15:36:56
【问题描述】:

我有一个相当复杂的数据库,我想先将其映射到代码,但我遇到了一个需要拆分为两个单独类的表的问题。

表结构的基本示例如下:

Site
----
Id
Name

Person
------
Id
Name
Dob
Address
Rank
Age
SiteId

PersonRoleLink
--------------
PersonId
RoleId

Role
----
Id
Name

基本上,一个站点有很多人,每个人都可以担任多个角色。

根据该人的角色,取决于填充的属性。

理想情况下,我想要一个如下的类结构:

public class Site {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Customer> Customers { get; set; }
  public virtual ICollection<Employee> Employees { get; set; }
  public virtual ICollection<Manager> Managers { get; set; }
}

public class PersonBase {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual Site Site { get; set; }
}

public class Customer : PersonBase {
  public string Name { get; set; }
  public DateTime Dob { get; set; }
}

public class Employee: PersonBase {
  public int Age { get; set; }
}

public class Manager: PersonBase {
  public int Rank { get; set; }
}

其中Customer、Employee 和Manager 都来自Person 表,并且依赖于PersonRoleLink 表中的相关链接。

因此,当我调用 Site.Managers 之类的内容时,Person 表中返回的行是具有正确 SiteId 并带有指向名为“经理”的 Role 的链接的行

这种结构在代码中是否可行?如果是这样,这个映射是如何实现的?如果没有,这个结构是否有任何可行的替代方案?

谢谢

【问题讨论】:

    标签: .net entity-framework ef-code-first code-first


    【解决方案1】:

    EF 不可能,因为它是数据驱动的映射,并且 EF 代码首先不支持它,除了一个例外:每个层次结构继承映射的表,其中映射表中单个列的值可以不同映射的子实体。在您的情况下,不同实体类型的值是两个关系。此外,person 表中的一条记录可以表示多个实体实例。这是另一个问题,因为这些实例没有唯一键,EF 无法做到这一点。

    通常,您假设的对象模型是错误的,因为您可以有一个人既是员工又是经理。它不应该导致两个不同的“Person”对象。用户Person 直接使用导航属性到角色并创建帮助方法来获取经理、员工和客户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多