AutoMapper和DateTime to String映射不起作用

时间:2014-03-31 03:56:08

标签: c# automapper automapper-3

我已经在使用AutoMapper几天了,但我现在最困难的时间映射值对我来说似乎是基本任务。我很可能是愚蠢的,但它开始变得非常令人沮丧,所有这些不断的例外被抛出。 /咆哮

无论如何,我有一个Entity Framework代理对象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;
    }
}

这导致了这个: Type'System.String'没有默认构造函数

吉米,你在浏览吗?请指出正确的方向,因为此时我认为通过手动映射我将完成比使用AutoMapper更多的工作。

哦,这是针对那些想知道的AutoMapper 3.1.1,Entity Framework 6.1,ASP.NET MVC 5.1.1。

2 个答案:

答案 0 :(得分:4)

尝试使用此代替自定义转换器..

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.

答案 1 :(得分:3)

您也可以使用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会在解析路径中添加一些空值检查(除此之外)。这是a good discussion about the subject