在反向映射中使用自定义映射
use custom mapping in reverse map
这是我的代码:
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,并将其映射到实体。我想在自动映射时添加时间但是它不起作用。
如果我从 entity(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));
}
基于此 url 我们可以添加类似日期时间的代码,我使用 override
发送
link
原因是,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()));
}
}
这是我的代码:
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,并将其映射到实体。我想在自动映射时添加时间但是它不起作用。
如果我从 entity(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));
}
基于此 url 我们可以添加类似日期时间的代码,我使用 override
发送
link
原因是,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()));
}
}