请我在一个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
对象
Exam
和ExamEditVm
的映射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
,并使用Automapper
和MappingProfile
映射后保持exam
对象旧的未映射属性值?
通过执行exam = _mapper.Map<Exam>(model);
,您实际上创建了一个新的Exam
实例,只有ExamEditVm model
中的数据。
你要做的,是将ExamEditVm model
对象中的数据应用/映射到现有的Exam exam
对象上。
为此,您必须使用Map
重载同时传递源对象和目标对象:
_mapper.Map(model, exam);