ASP. NET C# Как сопоставить исходный идентификатор с объектом Destionation - PullRequest
0 голосов
/ 14 января 2020

Я новичок в AutoMpper и пытаюсь сопоставить свой объект DTO с сущностью, которую следует сохранить в БД. Вот мой пример кода:

public class SourceObject {
 public int Id {get; set;}
 public string Description {get; set;}
 public int StatusId {get; set;}
}

public class DestinationObject {
 public int Id {get; set;}
 public string Description {get; set;}
 public DestinationStatus Status {get; set;}
}

public DestinationStatus {
 public int Id {get; set;}
 public string Description {get; set;}
}

Как определить класс MappingProfile для AutoMapper, который сопоставляет входное свойство StatusId (простой тип) SourceObject со свойством DestinationStatus (объектом) DestinationObject? Заранее большое спасибо.

1 Ответ

0 голосов
/ 14 января 2020

Вы не можете. Лучшее, что вы можете здесь сделать, это добавить свойство внешнего ключа для ссылки Status, чтобы вы могли затем сопоставить ключ с ключом. EF выполнит объектную фиксацию ссылки автоматически при сохранении.

Если вы не можете или не хотите этого делать, тогда ваш единственный выбор - это пользовательский преобразователь значений, который может быть крайне неэффективным. По сути, вы должны сказать, что AutoMapper чтобы сопоставить идентификатор опорных опор, он должен использовать свой собственный распознаватель. Затем этот пользовательский распознаватель возьмет идентификатор и использует его для запроса объекта к базе данных, а затем вернет объект. Если вы отображаете список вещей, это вызовет N запросов, по одному для каждого элемента в списке (следовательно, это неэффективно и не рекомендуется). Также обратите внимание, что запрос должен быть выполнен syn c, а не asyn c, так как AutoMapper API не поддерживает асин c операции. Это может вызвать проблемы в определенном сценарии ios, где может возникнуть проблема с блокировкой.

public class StatusResolver : IValueResolver<SourceObject, DestinationObject, DestinationStatus>
{
    private readonly MyContext _context;

    public StatusResolver(MyContext context)
    {
        _context = context;
    }

    public DestinationStatus Resolve(SourceObject source, DestinationObject destination, int member, ResolutionContext context)
    {
        return _context.DestinationStatuses.Find(source.StatusId);
    }
}

Тогда

.ForMember(dest => dest.Status, opts => opts.MapFrom<StatusResolver>())
...