我们正在使用.net内核中的AutoMapper(9.0.0)在源和目标之间映射值。到时间为止,一切正常。但是,我们需要将某些值保留在映射后的目标位置。
我们已尝试在成员上使用UseDestinationValue()
和Ignore()
方法,但它不保留现有值。下面是相同的代码。
RequestModel
public class RequestModel
{
public int Id { get; set; }
public int SubmittedById { get; set; }
public string Description { get; set; }
public string Location { get; set; }
}
RequestDto
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作为请求参数API
[HttpPost]
public IActionResult Save([FromBody] RequestDto requestDto)
{
// Some logic to save records
}
因此,在保存记录之前,我们将RequestD映射到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列在请求表中不存在,但我们要在保存记录后使用其值。
因此,如何在映射后保留目标值。
对此有任何帮助!
我认为您必须使用接受目的地的Map重载。
这与我在控制台应用程序中使用的模型/ 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
部分。