Как сохранить значения в месте назначения с помощью автоматического сопоставления в. net ядро - PullRequest
0 голосов
/ 16 января 2020

Мы используем AutoMapper (9.0.0) in. net core для отображения значений между источником и местом назначения. До времени это работает нормально. Тем не менее, нам нужно сохранить некоторые значения в пункте назначения такими, какие они есть после отображения.

Мы пытались использовать 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; }
}

Мы принимаем Dto в API в качестве параметра запроса API

[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>()
       }
}

This Столбец SubmittedByName отсутствует в таблице запросов, но мы хотим использовать его значение после сохранения записей.

Итак, как мы можем сохранить значение назначения после сопоставления.

Любая помощь по этому вопросу ценится!

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Я думаю, что вы должны использовать перегрузку карты, которая принимает пункт назначения.

Это работает для меня, используя ту же модель / 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 голосов
/ 16 января 2020

Мы пытались использовать методы UseDestinationValue () и Ignore () для члена, но он не сохраняет существующие значения. Ниже приведен код для того же.

, поскольку это не сработало для вас

Я бы предложил создать подобный класс generic c (при условии, что у вас есть несколько классов 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 объект без изменения других свойств.

...