Automapper-POST / PUT实体嵌套层次结构

时间:2018-12-18 10:55:49

标签: asp.net-core .net-core entity-framework-core automapper

我想使用DTO和AutoMapper对包含嵌套实体列表并具有层次结构的实体进行POST和PUT。

样品:

一家公司有一个雇员列表。在此员工列表中,可以有一个经理,该经理也是同一家公司的员工。

public class Company {
    public int Id { get; set; }
    public List<Employee> Employees { get; set; }
}

public class Employee {
    public int Id { get; set; }

    public Company Company { get; set; }
    public int CompanyId { get; set; }

    public Employee Manager { get; set; }
    public int? ManagerId { get; set; }
}

我想创建一个DTO,该DTO可以发布和更新公司,以创建/更新/删除和更改员工之间的关系。

您将如何知道某些员工由于新创建而没有ID,而又是其他员工的父母呢?

预先感谢您的帮助。

精度:我使用点网核心2.2,实体框架核心和AutoMapper。

1 个答案:

答案 0 :(得分:1)

您可以按照以下步骤进行操作。

public class CompanyDto {
    public int Id { get; set; }
    //Below line cannot exist here, otherwise it will create circular references
    //public List<Employee> Employees { get; set; }
}

public class EmployeeDto {
    public int Id { get; set; }

    public Company Company { get; set; }
    public int CompanyId { get; set; }

    public Employee Manager { get; set; }
    public int? ManagerId { get; set; }
}

此后,您可以在自动映射器配置中为Company-> CompanyDto(和反向映射)和Employee到EmployeeDto(和反向映射)创建映射。

现在,要处理现有员工新经理的情况,您可以在存储库中执行以下任一操作(使用实体对象,而不是DTO)

  1. 创建新员工,然后使用存储库中新生成的员工ID更新现有员工
  2. 或者,在存储库中获取要更新的所有员工(在上下文中加载),然后使用EntityState.Added在上下文中添加新员工。现在,为新来的员工分配经理,并保存您的上下文