【问题标题】:Entity Framework 6 Make relation on behalf of ID or enum value实体框架 6 代表 ID 或枚举值建立关系
【发布时间】:2019-03-04 10:04:32
【问题描述】:

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

员工

  • 身份证
  • 姓名
  • RoleEnum(CEO、领导、开发人员)
  • 优势虚拟列表

优势

  • 身份证
  • 说明

员工优势

  • 身份证
  • 优势 ID
  • EmployeeID(可为空)*
  • RoleEnum (Nullable) *

*) 每行只有一个有一个值

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

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

【问题讨论】:

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


    【解决方案1】:

    从关系建模的角度来看,最好将Advantages 的Employees 与Advantages 的Roles 分开。

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

    【讨论】:

    • 非常感谢您的回答!我选择了另一个解决方案,但你让我再次评估我的表格 (y)
    【解决方案2】:

    据我所知,你想要的都是不可能的。但是您可以为 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 编写扩展的,它是一个单独的类还是它是如何工作的?
    • 是的,它是一个单独的类,它将一个函数(方法)“添加”到您的模型类(Employee)中。 Here 是一个很好的文档。
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多