在我的数据库中,有些表之间依赖于ID或Enum值。这是结构:
员工
优势
EmployeeAdvantages
*)每行只有一个值
Employee和Advantages之间的关系可以基于基于EmployeeID和AdvantagesID的直接关系,也可以基于RoleEnum。
因此,当我用EF加载Employee时,我希望自动填充优势的虚拟列表,并且当该关系基于EmployeeID和AdvantagesID时,此行为也起作用,但是当该关系基于RoleEnum时,它仍然起作用当然不是开箱即用的,但是不能配置EF来处理这种情况吗?因此,如果员工具有“ CEO”角色,它将在EmployeeAdvantages中加载基于该角色的所有关系吗?
答案 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
这样,您可以根据员工的角色在Role
和RoleAdvantages
之间建立关系,从而自动加载该Employee
中的RoleAdvantage
。然后,您只需要从两个集合中收集Advantages
即可。