我的数据库实体如下(只保留相关信息):
这里的目标是,只有当实际状态存在时,我的
然而,我在配置Automapper中遇到了困难。我已经创建了
我不知道如何填写评论部分。我可以访问原始实体 (
我的方法感觉比必须的还要矫揉造作,但如果在源数据中没有实际实体支持,我不知道如何引入这个中介的
然而据我所知,设置地图本身并不是英雄特定的,应该纯粹使用Automapper语法。
public class Task
{
public Guid? StatusId { get; set; }
public Status Status { get; set; }
public DateTime? StatusLastModified { get; set; }
}
public class Status
{
public string Name { get; set; }
// several other properties redacted
}
任务最初没有状态(此时StatusLastModified也为null),一旦分配了第一个状态,任务将始终具有状态(此时StatusLastModified也不为null)。
为了回答这个问题,您可以假设这些属性始终都是null或非null,我不需要考虑其中一个为null而另一个不是的异常情况。
对于我的DTO,我希望将其映射到以下结构:
public struct TaskDto
{
public TaskStatusDto? Status { get; set; }
}
public struct TaskStatusDto
{
public DateTime Timestamp { get; set; } // maps from Task.StatusLastModified
public StatusDto Status { get; set; } // maps from Task.Status
}
public struct StatusDto
{
public string Name { get; set; }
// and all the other properties from the Status entity
}
这里的目标是,只有当实际状态存在时,我的
TaskDto
才有一个基础的TaskStatusDto
,否则它应为null。这很有帮助,因为它消除了不断检查状态对象和上次修改日期的需要。然而,我在配置Automapper中遇到了困难。我已经创建了
Status
和StatusDto
之间的映射:configuration
.CreateMap<Status, StatusDto>();
我的真实映射更加复杂,但已被证明可以正常工作,因此您可以假设这是有效且可行的映射。
我面临的问题是,在创建 Task
和 TaskDto
之间的自定义映射时,我如何引用此映射。目前我已尝试以下方法:
configuration
.CreateMap<Task, TaskDto>()
.ForMember(
dto => dto.Status,
opt => opt.MapFrom(entity =>
entity.Status == null
? null as TaskStatusDto?
: new TaskStatusDto()
{
TimeStamp = entity.StatusLastModified.Value,
Status = // ??? make me a StatusDto from entity.Status
}
));
我不知道如何填写评论部分。我可以访问原始实体 (
entity.Status
),但我不知道如何告诉Automapper将此对象转换为StatusDto
,并按照它应该已知的映射进行转换。我的方法感觉比必须的还要矫揉造作,但如果在源数据中没有实际实体支持,我不知道如何引入这个中介的
TaskStatusDto
对象。
一个小注释,不确定是否相关:我正在使用Heroic.Automapper,这意味着TaskDto
和StatusDto
映射被配置在不同的位置(即在TaskDto
和StatusDto
类内部),Heroic框架将在运行时组合所有这些映射。
public class TaskDto : IMapFrom<Task>, IHaveCustomMappings
{
public void CreateMappings(IMapperConfigurationExpression configuration)
{
// mapping from Task to TaskDto
}
}
public class StatusDto : IMapFrom<Status>, IHaveCustomMappings
{
public void CreateMappings(IMapperConfigurationExpression configuration)
{
// mapping from Status to StatusDto
}
}
然而据我所知,设置地图本身并不是英雄特定的,应该纯粹使用Automapper语法。
context.Mapper
。 - Lucian BargaoanuStatus
到TaskStatusDto?
的映射,并删除MapFrom
。 - Lucian BargaoanuTask.StatusLastModified
,因为这是TaskStatusDto.Timestamp
的源数据? - Flatercontext.Items
中。 - Lucian Bargaoanu