如何使用AutoMapper实现多表关联数据到数组的映射
问题描述
我拥有三张数据表:
Company表
| Id | Name |
|---|---|
| 1 | Company 1 |
| 2 | Company 2 |
Users表
| Id | Name |
|---|---|
| 1d0ba340-7ff6-47a4-a9a4-46345a228e53 | User 1 |
| 229c4525-e12d-4a01-8eda-e611ca8b721c | User 2 |
UserCompany关联表
| Id | UserId | CompanyId |
|---|---|---|
| 0DCA3DBE-747F-489B-A85D-2BE7E1A03140 | 1d0ba340-7ff6-47a4-a9a4-46345a228e53 | 1 |
| 123C04DB-A62B-4B4A-AA5C-CE1E35540BB0 | 1d0ba340-7ff6-47a4-a9a4-46345a228e53 | 2 |
| 2306F3EA-173F-4F47-8C11-62C29A963C9F | 229c4525-e12d-4a01-8eda-e611ca8b721c | 2 |
我定义了如下DTO,用于映射Company表并携带分配给该公司的用户名称列表:
public record CompanyDto( int Id, string Name, IEnumerable<string> UsersList);
请问如何使用AutoMapper实现将Company表数据与关联的用户名称列表映射到上述DTO的需求?
解决方案
要实现这个映射,可按以下步骤配置AutoMapper:
1. 确保实体类定义正确
先定义对应数据表的实体类,包含必要的导航属性以关联数据:
// Company实体 public class Company { public int Id { get; set; } public string Name { get; set; } public ICollection<UserCompany> UserCompanies { get; set; } = new List<UserCompany>(); } // User实体 public class User { public Guid Id { get; set; } public string Name { get; set; } public ICollection<UserCompany> UserCompanies { get; set; } = new List<UserCompany>(); } // UserCompany关联实体 public class UserCompany { public Guid Id { get; set; } public Guid UserId { get; set; } public int CompanyId { get; set; } public User User { get; set; } public Company Company { get; set; } }
2. 配置AutoMapper映射规则
创建映射配置类,指定Company到CompanyDto的映射逻辑:
public class MappingProfile : Profile { public MappingProfile() { CreateMap<Company, CompanyDto>() // 自动匹配Id、Name等同名属性,仅需配置UsersList的映射 .ForMember(dest => dest.UsersList, opt => opt.MapFrom(src => src.UserCompanies.Select(uc => uc.User.Name))); } }
3. 注册AutoMapper并执行映射
在依赖注入容器中注册AutoMapper(以ASP.NET Core为例):
builder.Services.AddAutoMapper(typeof(MappingProfile));
在业务逻辑中注入IMapper,加载关联数据后执行映射:
public class CompanyService { private readonly IMapper _mapper; private readonly YourDbContext _dbContext; public CompanyService(IMapper mapper, YourDbContext dbContext) { _mapper = mapper; _dbContext = dbContext; } public IEnumerable<CompanyDto> GetCompaniesWithUsers() { // 加载关联数据,避免N+1查询问题 var companies = _dbContext.Companies .Include(c => c.UserCompanies) .ThenInclude(uc => uc.User) .ToList(); return _mapper.Map<IEnumerable<CompanyDto>>(companies); } }
关键注意点
- 查询时必须通过
Include和ThenInclude加载UserCompany和User的关联数据,否则UsersList会返回空集合。 - AutoMapper会自动匹配同名的简单属性,无需额外配置。
- 若实体导航属性命名不同,需调整
MapFrom中的表达式路径。
内容的提问来源于stack exchange,提问作者Zulfikar Badurdeen
相关产品推荐
相关产品推荐

