我已经弄乱了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
沿解析路径添加了一些空检查(以及其他内容)。这是关于该主题的良好讨论