使用Automapper将一些属性从TSource映射到TDestination,而不丢失旧的其他TDestinatio



请我在一个Asp工作。网络核心项目目标。净5Clean architecture.

Core layer中有Entity

考试实体:

public class Exam : IExam
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public DateTime ExamDate { get; set; }
[Required]
public TimeSpan ExamTime { get; set; }
[Required]
public decimal DurationByHour { get; set; }
[Required]
public string GroupId { get; set; }
[Required]
public string SchoolSubjectId { get; set; }
[Required]
public string ProfId { get; set; }
public virtual Group                 Group         { get; set; }
public virtual SchoolSubject         SchoolSubject { get; set; }
public virtual Prof                  Prof          { get; set; }
public virtual ICollection<ExamMark> ExamMarks     { get; set; }
public string   CreatedBy    { get; set; }
public DateTime CreatedOn    { get; set; }
public bool     IsEdited     { get; set; }
public string   LastEditor   { get; set; }
public DateTime LastEditDate { get; set; }
}

我有这个视图模型(用于编辑)一个Exam对象

ExamEditVm视图模型/DTO:

public class ExamEditVm
{
public int         Id             { get; set; }
public DateTime    ExamDate       { get; set; }
public TimeSpan    ExamTime       { get; set; }
public decimal     DurationByHour { get; set; }
public string      GroupId        { get; set; }
public List<Group> Groups         { get; set; }
}

很好,现在当用户在编辑视图中进行编辑时并提交结果,另一个Edit操作结果HTTPPOST将作为ExamEditVm对象接收编辑。此时,该操作应该选择Exam使用MappingProfile,该动作将把ExamEditVm对象映射到选定的Exam对象

ExamExamEditVm的映射Profile:

CreateMap<Exam , ExamEditVm>().ReverseMap();

HttpPost编辑操作结果:

public async Task<IActionResult> Edit(ExamEditVm model)
{
if (ModelState.IsValid)
{
var exam = await _examRepository.GetByIdAsync( model.Id );
exam = _mapper.Map<Exam>( model);
exam.WriteEditingAudit( _appUser );

await _examRepository.UpdateAsync( record : exam );
await _uow.CommitAsync();

return RedirectToAction( nameof( Edit ) , new {model.Id} );
}
// Some logic
}

到底是什么问题?问题在这一行

exam = _mapper.Map<Exam>( model);

当从ExamEditVm映射到Exam时,exam将失去所有未映射的属性值,因为他得到了另一个对象值。那么,我如何从ExamEditVm映射到Exam,并使用AutomapperMappingProfile映射后保持exam对象旧的未映射属性值?

我希望你能理解这个问题。

通过执行exam = _mapper.Map<Exam>(model);,您实际上创建了一个新的Exam实例,只有ExamEditVm model中的数据。

你要做的,是将ExamEditVm model对象中的数据应用/映射到现有的Exam exam对象上。
为此,您必须使用Map重载同时传递源对象和目标对象:

_mapper.Map(model, exam);

最新更新