EF Core和Automapper一对多映射关系

问题描述

我目前正在运行代码优先实体框架的项目上使用AutoMapper。

这里只是简单的实体和DTO:

// DTO Profile
public class CreateOrEditProfileDto 
{        
    public string Code { get; set; }
    public string Name { get; set; }

    public List<RouteDto> Routes { get; set; }
}

// entity Profile
public class Profile
{       
    public virtual string Code { get; set; }
    public virtual string Name { get; set; }
}

// DTO Route
public class RouteDto 
{
    public string DriverName { get; set; }
    public string DriverSurname { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public int ProfileId { get; set; }
}

//entity Route
public class Route
{
    public virtual string DriverName { get; set; }
    public virtual string DriverSurname { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Email { get; set; }
    public virtual int ProfileId { get; set; }

    [ForeignKey("ProfileId")]
    public Profile ProfileFk { get; set; }
}

//Mapper
configuration.CreateMap<RouteDto,Route>().ReverseMap();
// configuration.CreateMap<CreateOrEditProfileDto,Profile>().ReverseMap();

// this type of configuration give the error written below
configuration.CreateMap<CreateOrEditProfileDto,Profile>()
     .ForMember(dest => dest,opt =>
        opt.MapFrom(src => src.Routes.Select(x =>
           new Route()
              {
                  ProfileId = x.ProfileId,DriverName = x.DriverName,DriverSurname = x.DriverSurname,Phone = x.Phone,Email = x.Email,}
           )
        )
     );

我有点困惑,我试图映射Profile和Route之间的一对多关系,Route对Profile有一个外键。单个配置文件可以具有更多路线。因此,我想创建一个配置文件并附加路由列表,但是在编译解决方案时,出现此错误

AutoMapper.AutoMapperConfigurationException:“成员的自定义配置仅支持类型上的顶级单个成员。”

有人知道解决此映射的最佳方法吗?

致谢

解决方法

由于List<RouteDto>被映射到Profile,因此类型不匹配。您需要在Profile中添加一个属性。

 public class Profile
{
    public virtual string Code { get; set; }
    public virtual string Name { get; set; }
    public List<Route> Routes { get; set; }
}

需要指定映射属性dest.Routes。然后,Routes将被自动映射。

  CreateMap<CreateOrEditProfileDto,EntityProfile>()
          .ForMember(dest => dest.Routes,opt =>
             opt.MapFrom(src => src.Routes.Select(x=>
             new Route()
             {
                 ProfileId = x.ProfileId,DriverName = x.DriverName,DriverSurname = x.DriverSurname,Phone = x.Phone,Email = x.Email,}
             ))
          );