实体框架6代表ID或枚举值建立关系

时间:2019-03-04 10:04:32

标签: c# .net sql-server entity-framework entity-framework-6

在我的数据库中,有些表之间依赖于ID或Enum值。这是结构:

员工

  • ID
  • 名称
  • RoleEnum(首席执行官,负责人,开发人员)
  • 优势虚拟列表

优势

  • ID
  • 说明

EmployeeAdvantages

  • ID
  • AdvantagesID
  • EmployeeID(可为空)*
  • RoleEnum(可空)*

*)每行只有一个值

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

因此,当我用EF加载Employee时,我希望自动填充优势的虚拟列表,并且当该关系基于EmployeeID和AdvantagesID时,此行为也起作用,但是当该关系基于RoleEnum时,它仍然起作用当然不是开箱即用的,但是不能配置EF来处理这种情况吗?因此,如果员工具有“ CEO”角色,它将在EmployeeAdvantages中加载基于该角色的所有关系吗?

2 个答案:

答案 0 :(得分:1)

据我所知,想要什么是不可能的。但是您可以为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

答案 1 :(得分:1)

从关系建模的角度来看,最好将Advantage的{​​{1}}与Employee的{​​{1}}分开。

最好有一个单独的表,例如Advantage 这样,您可以根据员工的角色在RoleRoleAdvantages之间建立关系,从而自动加载该Employee中的RoleAdvantage。然后,您只需要从两个集合中收集Advantages即可。