«Нет доступного конструктора» при вызове Persist() AutoMapper.InsertOrUpdate()

У меня есть простой объект с конструктором по умолчанию. Объекты, на которые я сопоставляю и из которых, определены точно так же, и я настроил для них сопоставитель. Все работает нормально, получая объект из базы данных.

public class Tag
{
    public Guid ProjectId { get; set; }
    public Guid TagId { get; set; }
    public string Name { get; set; }
}

Если я звоню Mapper.Instance.Map(tagFrom, tagTo);, все работает нормально, но если я звоню dbContext.Tags.Persist().InsertOrUpdate(tag);, я получаю эту ошибку.

Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters

AutoMapper created this type map for you, but your types cannot be mapped using the current configuration.

AutoMapper created this type map for you, but your types cannot be mapped using the current configuration. Tag -> Expression1 (Destination member list) AKS.Common.Models.Tag -> System.Linq.Expressions.Expression1[[System.Func`2[[AKS.AppCore.Entities.Tag, AKS.AppCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]] (Destination member list)

Unmapped properties:

Parameters

No available constructor.

Похоже, он говорит, что у меня нет конструктора по умолчанию, но он явно есть. Кто-нибудь знает, что я делаю неправильно?

Версии пакетов: Автокартограф 8.0.0 AutoMapper.Коллекции 5.0.0 AutoMapper.Collections.EntityFrameworkCore 0.2.0

В AutoMapper нет Persist или InsertOrUpdate. Проблема в том, что делает этот другой код.

Lucian Bargaoanu 10.04.2019 07:58

Вы используете AutoMapper.Collection.EntityFrameworkCore? Какая версия? Кроме того, исключение показывает объект, отличный от сообщения — TopicEdit, а также Expression<Func<TopicEdit, bool>>, поэтому убедитесь, что код, который вы публикуете, воспроизводит проблему.

Ivan Stoev 10.04.2019 10:05

Я обновил вопрос сообщением об ошибке для сопоставления объектов тегов. Я получаю ту же ошибку со всеми объектами, но работаю с тегом, так как это просто. Я также добавил версии пакетов Automapper, на которые я ссылаюсь.

Jeremy Hutchinson 10.04.2019 15:31

Я смог воспроизвести его. Это исчезнет, ​​если вы добавите CreateMap<Tag, Tag>() в конфигурацию AM. Однако, похоже, есть некоторая ошибка выражения эквивалентности, поэтому функция вообще не работает (делает неправильные вещи, потому что выражение GuidX == GuidX, например, true, поэтому FirstOrDefault() будет возвращать случайный элемент, а не тот, который необходимо обновить/удалить). Подумайте о том, чтобы опубликовать проблему на их трекере.

Ivan Stoev 11.04.2019 20:58

Не могли бы вы поделиться этим репродукцией? Я пытаюсь создать модульный тест, который воспроизводится, и, возможно, посмотреть, смогу ли я отправить PR. Но мне трудно воспроизвести вне моего более крупного проекта.

Jeremy Hutchinson 12.04.2019 13:29

Хорошо, теперь у меня есть простая реплика. Это что-то о том, как я настраиваю Mapper

Jeremy Hutchinson 12.04.2019 14:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может быть ошибка в AutoMapper.Collections.EntityFrameworkCore, или она может быть вызвана моим собственным неправильным использованием.

Я настраивал свой Mapper со следующим кодом

var cfg = new MapperConfigurationExpression();

cfg.AddCollectionMappers();
cfg.UseEntityFrameworkCoreModel<MyDbContext>();

cfg.CreateMap<TagDto, TagEntity>().ReverseMap();

Затем я пытался проверить свою конфигурацию сопоставления с помощью этого кода перед инициализацией сопоставления.

var config = new MapperConfiguration(cfg);
config.AssertConfigurationIsValid();

Mapper.Initialize(cfg);

Если я удалю строки, где я создаю MapperConfiguration, и использую это для AssertConfigurationIsValid(), тогда вызовы InsertOrUpdate() будут работать.

Я также обнаружил, что могу вызвать AssertConfigurationIsValid(), если сначала инициализирую свой преобразователь, а затем вызову этот метод в Mapper.Instance

Mapper.Initialize(cfg);
Mapper.Configuration.AssertConfigurationIsValid();

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