首页 > 解决方案 > 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:“成员的自定义配置仅支持类型上的顶级个人成员。”

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

问候

标签: asp.net-core.net-coreentity-framework-core-3.1

解决方案


因为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,
             }
             ))
          );

推荐阅读