Entity Framework 6 代表ID或枚举值建立关系

Entity Framework 6 Make relation on behalf of ID or enum value

在我的数据库中,一些表之间存在依赖于 ID 或枚举值的关系。这是结构:

员工

优势

员工优势

*) 每行只有一个值

Employee 和 Advantages 之间的关系可以基于基于 EmployeeID 和 AdvantagesID 的直接关系,也可以基于 RoleEnum。

因此,当我使用 EF 加载员工时,我希望自动填充虚拟优势列表,并且当关系基于 EmployeeID 和 AdvantagesID 时,此行为也有效,但当它基于RoleEnum 当然不是开箱即用的,但是否可以配置 EF 来处理这种情况?因此,如果员工具有 "CEO" 的角色,它将加载所有基于该角色的关系 in EmployeeAdvantages?

据我所知,你想要的是不可能的。但是您可以为 Employee 创建一个扩展,您可以在其中手动加载通过 RoleEnum 获得的 EmployeeAdvantages。基本上你会在你的扩展方法中这样做:

public static class EmployeeExtension
{
  public static int VirtualListOfAdvantages(this Employee employee)
  {
    var repo = new EmployeeAdvantagesRepository();
    var enumRoleAdvantages = 
        repo.GetAll().Where(ea => ea.RoleEnum == employee.RoleEnum).ToList();
    enumRoleAdvantages.AddRange(employee.VirtualListOfAdvantages);

    return enumRoleAdvantages;
  }
}

(我不知道你的存储库会是什么样子,但我想你明白了)

这当然不是您正在寻找的解决方案,但它是一个有效且非常简单的解决方案,应该运行良好。

有关扩展方法的更多信息(以及示例取自:How to: Implement and Call a Custom Extension Method

从关系建模的角度来看,最好将 Employee 中的 AdvantageRole 中的 Advantage 分开。

最好有单独的table像RoleAdvantages 通过这种方式,您可以根据员工的角色在 EmployeeRoleAdvantage 之间建立关系,从而自动加载 RoleAdvantages。然后您才需要从两个集合中收集 Advantage