。net核心中如何使用自动映射器在目标中保留值

问题描述 投票:0回答:2

我们正在使用.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列在请求表中不存在,但我们要在保存记录后使用其值。

因此,如何在映射后保留目标值。

对此有任何帮助!

c# asp.net-core .net-core automapper
2个回答
1
投票

我认为您必须使用接受目的地的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方法创建一个新对象,但重载方法将现有对象用作目标。


0
投票

我们已尝试在成员上使用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部分。

© www.soinside.com 2019 - 2024. All rights reserved.