我们在 .net core 中使用 AutoMapper (9.0.0( 在源和目标之间映射值。直到时间,这是工作正常。但是,我们需要在映射后将目标中的一些值保持原样。
我们尝试在成员上使用UseDestinationValue()
和Ignore()
方法,但它没有保留现有值。下面是相同的代码。
请求模型
public class RequestModel
{
public int Id { get; set; }
public int SubmittedById { get; set; }
public string Description { get; set; }
public string Location { get; set; }
}
请求Dto
public class RequestDto
{
public int Id { get; set; }
public int SubmittedById { get; set; }
public string Description { get; set; }
public string Location { get; set; }
public string SubmittedByName { get; set; }
}
我们接受 API 中的 Dto 作为请求参数 应用程序接口
[HttpPost]
public IActionResult Save([FromBody] RequestDto requestDto)
{
// Some logic to save records
}
因此,在保存记录之前,我们将 RequestDto 映射到 RequestModel,并将该模型传递给 DAL 层以保存这样的记录
var requestModel = MapperManager.Mapper.Map<RequestDto, RequestModel>(RequestDto);
并调用数据层
var requestModel = DAL.Save(RequestModel)
因此,在收到更新的请求模型后,我们再次将其映射到requestDto,在这种情况下,我们将丢失SubmittedByName属性的值。
return MapperManager.Mapper.Map<RequestModel, RequestDto>(requestModel);
映射器类
public class RequestProfile: Profile
{
public RequestProfile()
{
CreateMap<RequestModel, RequestDto>()
CreateMap<RequestDto, RequestModel>()
}
}
此 SubmittedByName 列在请求表中不存在,但我们希望在保存记录后利用其值。
那么,我们如何在映射后保留目标值。
对此的任何帮助表示赞赏!
我认为您必须使用接受目的地的地图重载。
这适用于我,使用您在控制台应用程序中发布的相同模型/dto:
var config = new MapperConfiguration(cfg => cfg.CreateMap<RequestModel, RequestDto>().ReverseMap());
var mapper = config.CreateMapper();
var source = new RequestDto
{
Id = 1,
SubmittedById = 100,
SubmittedByName = "User 100",
Description = "Item 1",
Location = "Location 1"
};
Console.WriteLine($"Name (original): {source.SubmittedByName}");
var destination = mapper.Map<RequestDto, RequestModel>(source);
Console.WriteLine($"Name (intermediate): {source.SubmittedByName}");
source = mapper.Map<RequestModel, RequestDto>(destination, source);
Console.WriteLine($"Name (final): {source.SubmittedByName}");
标准 Map 方法创建一个新对象,但重载方法使用现有对象作为目标。
我们尝试在成员上使用UseDestinationValue((和Ignore((方法,但它没有保留现有值。下面是相同的代码。
因为这对你不起作用
我建议创建一个这样的泛型类(假设您有多个 RequestDto 类(
class RequesterInfo<T>
{
public string RequesterName { get; set; } // props you want to preserve
public T RequestDto { get; set; } // props to be mapped
}
通过保持映射原样, 并将您的代码修改为如下所示的内容:
var requestModel = MapperManager.Mapper.Map<RequestDto, RequestModel>(RequesterInfo.RequestDto);
因此,发生的情况是,您修改对象的T RequestDto
部分而不修改其他属性。