3

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

无论如何,我有一个实体框架代理对象Company。通过一个基类Entity,它有一个名为CreatedDateTimewhich is a的属性DateTime。我还有一个名为 的 DTO 对象CompanyDto,它有一个名为 的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 完成更多的工作。

哦,对于那些想知道的人来说,这是 AutoMapper 3.1.1、Entity Framework 6.1、ASP.NET MVC 5.1.1。

4

2 回答 2

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.
于 2014-03-31T04:06:01.143 回答
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沿解析路径添加一些空检查(除其他外)。这是关于这个主题的一个很好的讨论

于 2014-03-31T10:16:36.270 回答