如何使用 .net core 中的自动映射器保留目标中的值



我们在 .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部分而不修改其他属性。

最新更新