自动映射器和日期时间到字符串映射不起作用

本文关键字:映射 字符串 时间 不起作用 日期 | 更新日期: 2023-09-27 17:55:24

我已经弄乱了AutoMapper几天了,但是我遇到了最困难的映射值,对我来说似乎是基本任务。我很可能是愚蠢的那个,但随着所有这些不断的异常被抛出,它开始变得非常令人沮丧。/咆哮

无论如何,我有一个实体框架代理对象Company.通过基类Entity它具有一个名为CreatedDateTime的属性,这是一个DateTime。我还有一个名为 CompanyDto 的 DTO 对象,它具有一个名为 CreatedDateTime 的属性,它是一个string。我要做的就是获取DateTime值并将其展平为ToString("g")。我尝试了很多东西,所有这些都抛出了某种异常。唯一有效的映射是,惊讶,惊讶:.Ignore() 。这是我对TypeConverter的最新尝试:

Mapper.CreateMap<DateTime, string>().ConvertUsing<DateTimeToStringConverter>();
public sealed class DateTimeToStringConverter : TypeConverter<DateTime, string> {
    protected override string ConvertCore(
        DateTime source) {
        if (source != null) {
            return source.ToString("g");
        }
        return string.Empty;
    }
}

这会导致这种情况:类型"System.String"没有默认构造函数

吉米,你这么在浏览?请指出我正确的方向,因为在这一点上,我认为手动映射比使用自动映射器可以完成更多的工作。

哦,这是AutoMapper 3.1.1,实体框架6.1 ASP.NET MVC 5.1.1,对于那些想知道的人。

自动映射器和日期时间到字符串映射不起作用

试试这个而不是自定义转换器。

Mapper.CreateMap<Company, CompanyDto>()
      .ForMember(d => d.CreatedDateTime,
        expression => expression.ResolveUsing(s=>s.CreatedDateTime.ToString("g")));
// now do the Mapper.Map from Company to CompanyDto.
您也可以

简单地使用 MapFrom 方法代替ResolveUsing

public class EFObject
{
    public DateTime D { get; set; }
}
public class DTOObject
{
    public string DS { get; set; }
}
internal class Program
{
    private static void Main(string[] args)
    {
        Mapper.CreateMap<EFObject, DTOObject>().
            ForMember(dtoo => dtoo.DS, opt => opt.MapFrom(efo => efo.D.ToString("g")));
        var fromDB = new EFObject() { D = DateTime.Now };
        var toDTO = Mapper.Map<EFObject, DTOObject>(fromDB);
    }
}

我建议使用 MapFrom 而不是 ResolveUsing,因为MapFrom沿解析路径添加了一些空检查(以及其他内容)。这是关于该主题的良好讨论