Automapper 5.2.0 и проекции с EF6 выдает исключение - ошибка?

При использовании Automapper 3.3.1 или 4.2.1 мой код работает нормально.

Но после обновления до 5.2.0 я получаю ArgumentException: "Тип 'System.String' не имеет конструктора по умолчанию" в AutoMapper.QueryableExtensions.ExpressionBuilder.DestinationConstructorExpression.

У нас есть устаревшая база данных, которая поддерживает несколько языков, и в нашей модели EF6 мы использовали сложный тип LocalizedString для хранения всех переведенных значений для каждого свойства строки. На основании этой статьи.

Образец кода:

    static void Main(string[] args)
    {
        Mapper.Initialize(p =>
            {
                CreateCustomMappingForLocalizedString(p);
                p.CreateMap<Country, CountryViewModel>();
            }
        );

        var db = new DemoContext();
        var countries = db.Country.ProjectTo<CountryViewModel>(new {lang = "nb"}).ToList();

        foreach (var c in countries)
            Console.WriteLine($"{c.CountryId} : {c.CountryCode} : {c.CountryName}");

        Console.WriteLine("Press <ENTER> to continue");
        Console.ReadLine();
    }

И пользовательское сопоставление LocalizedString

    public static void CreateCustomMappingForLocalizedString(IMapperConfigurationExpression cfg)
    {
        string lang = null;
        // Create MAP for LINQ Projections
        cfg.CreateMap<LocalizedString, string>()
            .ProjectUsing(src =>
            lang == "en"? src.ValueEn :
            lang == "da"? src.ValueDa :
            lang == "nn"? src.ValueNnNo :
            lang == "sv"? src.ValueSv :
            lang == "de" ? src.ValueDe :
            lang == "fi"? src.ValueFi :
            lang == "se"? src.ValueSeNo :
            src.ValueNo);
        cfg.CreateMap<LocalizedString, string>()
          .ConvertUsing(src =>
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "en" ? src.ValueEn :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "da" ? src.ValueDa :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "nn"? src.ValueNnNo :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "sv"? src.ValueSv :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "de"? src.ValueDe :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "fi"? src.ValueFi :
            Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "se"? src.ValueSeNo :
            src.ValueNo);
    }

Единственное изменение при переходе на 5.2.0 с 4.2.0 - это изменение типа параметра в CreateCustomMappingForLocalizedString с IMapperConfiguration на IMapperConfigurationExpression.

Я делаю что-то не так с Automapper 5.2.0 или это ошибка в Automapper?

Я разместил небольшой пример решения с отдельными проектами для версий 3.3.1, 4.2.1 и 5.2.0 в моем репозитории GitHub.

0 ответов

Другие вопросы по тегам