Asp.net core Automapper-POST/PUT实体嵌套层次结构

Asp.net core Automapper-POST/PUT实体嵌套层次结构,asp.net-core,.net-core,entity-framework-core,automapper,Asp.net Core,.net Core,Entity Framework Core,Automapper,我想使用DTOs和AutoMapper发布并放置一个实体,该实体包含嵌套实体的列表,具有层次结构 样本: 公司有一份员工名单。在此员工列表中,可以有一位经理,他也是同一公司的员工 public class Company { public int Id { get; set; } public List<Employee> Employees { get; set; } } public class Employee { public int Id { ge

我想使用DTOs和AutoMapper发布并放置一个实体,该实体包含嵌套实体的列表,具有层次结构

样本:

公司有一份员工名单。在此员工列表中,可以有一位经理,他也是同一公司的员工

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; }
}
上市公司{
公共int Id{get;set;}
公共列表雇员{get;set;}
}
公营雇员{
公共int Id{get;set;}
上市公司{get;set;}
public int CompanyId{get;set;}
公共员工经理{get;set;}
公共int?ManagerId{get;set;}
}
我想创建一个DTO,它能够发布和更新公司创建/更新/删除和更改员工之间的关系

如果知道一些员工可能还没有Id,因为他们是新创建的,但是是其他员工的父母,您会怎么做

提前谢谢你的帮助


精度:我使用dot net core 2.2、Entity Framework core和AutoMapper。

您可以按如下方式执行此操作

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; }
}
公共类CompanyDto{
公共int Id{get;set;}
//下面的行在此不存在,否则将创建循环引用
//公共列表雇员{get;set;}
}
公共类雇员{
公共int Id{get;set;}
上市公司{get;set;}
public int CompanyId{get;set;}
公共员工经理{get;set;}
公共int?ManagerId{get;set;}
}
之后,您可以在automapper配置中为Company->CompanyTo(和反向映射)和Employee-to-EmployeeDto(和反向映射)创建映射

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

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

  • 谢谢你的回答。所以这就是我想的,我必须手动操作我找不到一种方法让automapper自动操作:(