【发布时间】:2021-02-12 20:22:03
【问题描述】:
我对使用 AutoMapper 非常陌生,我花了几天时间在谷歌上搜索解决方案,但没有成功。我正在尝试将如下所示的 DTO 映射到我的实体类,其中包含多个级别的信息(年、季度、季节、期间、周、日)。
这是我的 DTO:
public class CalendarDto
{
public int Year { get; set; }
public int Quarter { get; set; }
public string Season { get; set; }
public int DayOfWeek { get; set; }
public string Date { get; set; }
public int WeekOfYear { get; set; }
public int DayOfYear { get; set; }
public int WeekOfPeriod { get; set; }
}
这是我的实体的前两个级别:
public class Calendar : ICalendar<string>
{
public string Id { get; set; }
public int Year { get; set; }
public string Date { get; set; }
public CalendarQuarter Quarters { get; set; }
}
public class CalendarQuarter
{
public int Year { get; set; }
public int Quarter { get; set; }
public string Date { get; set; }
public List<CalendarSeason> Seasons { get; set; }
}
如您所见,我从一年到季度、到季节、到时期、到每周和每天都有额外的嵌套级别。我只提供第一个级别,逐季逐年提供,因为我确信一旦我确定了一个级别,其余的将是直截了当的。
我尝试将配置文件设置为从 DTO 分别映射每个类,如下所示,因为所有属性值都匹配。
public class CalendarProfile : Profile
{
public CalendarProfile()
{
CreateMap<CalendarDto, Calendar>().ReverseMap();
CreateMap<CalendarDto, CalendarQuarter>().ReverseMap();
CreateMap<CalendarDto, CalendarSeason>().ReverseMap();
CreateMap<CalendarDto, CalendarPeriod>().ReverseMap();
CreateMap<CalendarDto, CalendarWeek>().ReverseMap();
CreateMap<CalendarDto, CalendarDay>().ReverseMap();
}
}
当我尝试将 DTO 映射到处理程序中的实体时,仅映射了 Calendar 类并且 CalendarQuarters 列表为空。我的理解是配置文件与配置相同,并且在配置文件中创建的所有映射都将在执行 Map 时执行。显然,我错了,我的映射设置不正确,或者两者兼而有之!哈哈
var calendar = _mapper.Map<CalendarDto, Calendar>(parms.Dto);
任何建议将不胜感激。感谢您的帮助!
【问题讨论】:
-
永远不要以这种方式使用 automaper。 automaper 的一位作者表示,automaper 旨在从实体映射到 DTO 或 VM。从不从 DTO 到实体。您应该使用构造函数或任何设计模式,例如工厂。以这种方式使用 automaper 会在项目长大后给您带来很多问题。
标签: c# automapper