AutoMapper - Получить поле из связанной исходной таблицы, отличное от того, которое связывает его - PullRequest
0 голосов
/ 31 мая 2019

У меня есть следующая структура таблицы, которая смешивает устаревшие поля с обновленной схемой:

Coaster
  Id (Int)
  ParkId (Int)

Park
  Id (int)
  UniqueId (Guid)

Итак, таблицы Coaster и Park связаны с помощью поля Park.Id. Поле UniqueId в настоящее время не используется в старой схеме. Мы переходим на чистую БД с помощью AutoMapper, и эта новая схема выглядит следующим образом:

Coaster
  Id (Int)
  ParkId (Guid)

Park
  Id (Guid)

Проблема, с которой я столкнулся, заключается в использовании AutoMapper. Я экспериментировал с этим кодом:

private ModelMapper()
{
    Mapper.Initialize(x =>
    {
        x.AddProfile<ConvertersMappingProfile>();
    });
}

    // This is the part that I'm trying to work out
    public ConvertersMappingProfile()
    {
            CreateMap<Park, NewSchema.Park>()
                .ForMember(dst => dst.Id, map => map.MapFrom(src => src.ParkId));
    }

В новой схеме идентификатор таблицы парковки совпадает с уникальным идентификатором старой схемы.

Мой вопрос: поскольку в старой схеме нет прямой ссылки на значение UniqueId таблицы Park, как получить это значение для сопоставления с новой схемой, используя поле Coaster.ParkId и поле Park.Id отображение

1 Ответ

0 голосов
/ 31 мая 2019

Я использовал нестандартное решение для решения проблемы. Поэтому я создал свой распознаватель, который извлекает список элементов в базе данных (который обычно довольно мал), чтобы получить все значения из нужной мне таблицы, и извлекает это значение. (Предварительно переработанный код):

public class ParkResolver : IValueResolver<Original.Park, New.Park, string> {
    public string Resolve(Original.Park source, New.Park dest, string destMember, ResolutionContext context) {

        List<Original.Park> list = new List<Original.Park>();

        using (IDbConnection con = new SQLiteConnection(@"Data Source=C:\Users\Me\Documents\Parks.sql;")) {
            con.Open();
            list = con.Query<Original.Park>($"SELECT * FROM Parks WHERE Id = {source.ParkId}").ToList();
            con.Close();
        }

        return list.FirstOrDefault().UniqueId;
    }
}

И я вызываю свой собственный распознаватель для таблиц, которые я отображаю:

        CreateMap<Original.Park, New.Park>()
            .ForMember(dst => dst.ParkId, map => map.MapFrom(new ParkResolver()));

Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...