在反向地图中使用自定义映射

问题描述 投票:0回答:1

这是我的代码:

public class PostDto : BaseDto<PostDto, Post>
{
    [JsonIgnore]
    public override int Id { get; set; }

    [Required]
    [StringLength(200)]
    public string Title { get; set; }

    [Required]
    [DataType(DataType.Html)]
    public string Text { get; set; }

    [Required]
    [StringLength(500)]
    [DataType(DataType.Text)]
    public string ShortDescription { get; set; }

    [Required]
    public int TimeToRead { get; set; }

    [Required]
    [DataType(DataType.ImageUrl)]
    public string Image { get; set; }

    [Required]
    public int CategoryId { get; set; }

    [JsonIgnore]
    public DateTimeOffset Time { get; set; }

    [JsonIgnore]
    public int UserId { get; set; }

    public override void CustomMappings(IMappingExpression<Post, PostDto> mappingExpression)
    {
            mappingExpression.ForMember(
               dest => dest.Time,
               config => config.MapFrom(src => DateTimeOffset.Now));

            mappingExpression.ReverseMap().ForMember(
                dest => dest.Time,
                config => config.MapFrom(src => DateTimeOffset.Now));

            mappingExpression
                .ForMember(d => d.Time, opt => opt.MapFrom(src => DateTimeOffset.Now))
                .ReverseMap()
                .ForMember(d => d.Time, opt => opt.MapFrom(src => DateTimeOffset.Now))
                .ForPath(s => s.Time, opt => opt.MapFrom(src => DateTimeOffset.Now));
     }
}

我从控制器获取 dto,并将其映射到实体。我想在自动映射时添加时间,但它不起作用。
如果我从实体(post)映射到 dto(postDto),例如将日期转换为字符串,它可以工作,但反过来它就不起作用

我的控制器:

public override Task<ApiResult<PostSelectDto>> Create(PostDto dto, CancellationToken cancellationToken)

将 dto 转换为实体的代码(在 [model] 中的地图时间为 null 或 datetimeoffset 默认值之后)

var model = dto.ToEntity(Mapper);

ToEntity 方法:

public TEntity ToEntity(IMapper mapper)
{
    return mapper.Map<TEntity>(CastToDerivedClass(mapper, this));
}
c# .net asp.net-core automapper
1个回答
0
投票

基于此网址,我们可以添加类似日期时间的代码,我使用覆盖发送
链接

原因是,UseValue 是静态值,因此在实例化 MapProfile 时设置一次,并且所有后续 .Map() 调用都将使用相同的静态值

所以我编写自定义地图而不使用反射来为实体和 dto 创建地图

public class PostCustomMapping : IHaveCustomMapping
{
    public void CreateMappings(Profile profile)
    {
        profile.CreateMap<Post, PostDto>().ReverseMap()
            .ForMember(dest => dest.Time,
                opt =>
                    opt.MapFrom(src => DateTimeOffset.Now))

            .ForMember(dest => dest.Text,
                opt =>
                    opt.MapFrom(src => src.Text.FixPersianChars()))

            .ForMember(dest => dest.Title,
                opt =>
                    opt.MapFrom(src => src.Title.FixPersianChars()))

            .ForMember(dest => dest.ShortDescription,
                opt =>
                    opt.MapFrom(src => src.ShortDescription.FixPersianChars()));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.