问题描述
我目前正在运行代码优先实体框架的项目上使用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,}
))
);