gpt4 book ai didi

c# - 使用 Automapper 将一些属性从 Source 映射到 Destination,而不会丢失旧的其他 TDestination 对象属性值

转载 作者:行者123 更新时间:2023-12-04 07:14:00 24 4
gpt4 key购买 nike

请我正在处理 Asp.Net核心项目目标 .Net 5 清洁架构 .
我有这个 EntityCore layer 考试实体:

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; }
}
我有这个 View 模型(用于编辑) 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; }
}
很好,现在当用户在 中进行一些编辑时编辑 View 并提交结果,另一个 Edit 行动结果 HTTPPOST 将收到编辑为 ExamEditVm目的。
此时 Action 应该选择 考试 谁应该被编辑和使用 MappingProfile该操作将映射 ExamEditVm选定对象 Exam目的
Exam之间的映射配置文件和 ExamEditVm :
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并保留 exam使用 Automapper 映射后的旧对象未映射属性值和 MappingProfile ?
我希望你明白这个问题。
所以请为他的问题提供任何解决方案。

最佳答案

通过做 exam = _mapper.Map<Exam>(model);你实际上是在创建一个新的 Exam实例,
只有 ExamEditVm model 中存在的数据.
您想要做的是应用/映射来自 ExamEditVm model 的数据。反对现有 Exam exam目的。
为此,您必须使用 Map重载传递源对象和目标对象:

_mapper.Map(model, exam);

关于c# - 使用 Automapper 将一些属性从 Source 映射到 Destination,而不会丢失旧的其他 TDestination 对象属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68894925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com