У меня есть простой объект с конструктором по умолчанию. Объекты, на которые я сопоставляю и из которых, определены точно так же, и я настроил для них сопоставитель. Все работает нормально, получая объект из базы данных.
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 -> Expression
1 (Destination member list) AKS.Common.Models.Tag -> System.Linq.Expressions.Expression
1[[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.Collection.EntityFrameworkCore? Какая версия? Кроме того, исключение показывает объект, отличный от сообщения — TopicEdit
, а также Expression<Func<TopicEdit, bool>>
, поэтому убедитесь, что код, который вы публикуете, воспроизводит проблему.
Я обновил вопрос сообщением об ошибке для сопоставления объектов тегов. Я получаю ту же ошибку со всеми объектами, но работаю с тегом, так как это просто. Я также добавил версии пакетов Automapper, на которые я ссылаюсь.
Я смог воспроизвести его. Это исчезнет, если вы добавите CreateMap<Tag, Tag>()
в конфигурацию AM. Однако, похоже, есть некоторая ошибка выражения эквивалентности, поэтому функция вообще не работает (делает неправильные вещи, потому что выражение GuidX == GuidX
, например, true
, поэтому FirstOrDefault()
будет возвращать случайный элемент, а не тот, который необходимо обновить/удалить). Подумайте о том, чтобы опубликовать проблему на их трекере.
Не могли бы вы поделиться этим репродукцией? Я пытаюсь создать модульный тест, который воспроизводится, и, возможно, посмотреть, смогу ли я отправить PR. Но мне трудно воспроизвести вне моего более крупного проекта.
Хорошо, теперь у меня есть простая реплика. Это что-то о том, как я настраиваю Mapper
Это может быть ошибка в 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();
В AutoMapper нет Persist или InsertOrUpdate. Проблема в том, что делает этот другой код.