我已经在使用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。
答案 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