这是我的代码:
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));
}
基于此网址,我们可以添加类似日期时间的代码,我使用覆盖发送
链接
原因是,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()));
}
}