Атрибут Automapper MapsTo не работает на ссылочных классах - PullRequest
0 голосов
/ 07 июня 2018

Я изо всех сил пытаюсь понять, что я здесь делаю неправильно.Я использовал Automapper + Automapper.Attributes (https://github.com/schneidenbach/AutoMapper.Attributes) в решении, и недавно мне пришлось разделить мой проект API на «базовую» библиотеку и исходный API. Automapper не может создатькарта, когда файлы классов перемещаются за пределы проекта API. Я установил демонстрационный проект со следующей структурой для подтверждения этой проблемы: (Доступно здесь: https://github.com/greghesom/AutoMapper_Example)

  • Решение
    • API (класс клиента и человека)
    • API.Core (классы домашних животных и собак)

  • Проект API ссылается на API.Core
  • Класс Pet соответствует классу Dog
  • Класс Person соответствует классу Customer

API.Core - класс Dog

namespace API.Core
{
    public class Dog
    {
        public string Name { get; set; }
    }
}

API.Core - класс питомца

namespace API.Core
{
    [MapsTo(typeof(Dog))]
    public class Pet
    {
        [MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
        public string PetName { get; set; }
    }
}

API - класс персонажа

namespace API.Models
{
    [MapsTo(typeof(Customer))]
    public class Person
    {
        [MapsToProperty(typeof(Customer), "FirstName")]
        public string Name { get; set; }
    }
}

API - класс клиента

namespace API.Models
{
    public class Customer
    {
        public string FirstName { get; set; }
    }
}

API - запуск

   AutoMapper.Mapper.Initialize(cfg => {
                typeof(API.WebApiConfig).Assembly.MapTypes(cfg);  
            });

API - контроллер

var person = new Person { Name = "John" };
var customer = AutoMapper.Mapper.Map<Customer>(person);//This Works

var dog = new Dog { Name = "Lucky" };
var pet = AutoMapper.Mapper.Map<Pet>(dog);//This throws exception

ИСКЛЮЧЕНИЕ:

Произошла ошибка.Не нанесенные на карту участники были найдены.Просмотрите типы и членов ниже.Добавьте пользовательское выражение сопоставления, игнорируйте, добавьте пользовательский преобразователь или измените тип источника / назначения. Если нет подходящего конструктора, добавьте ctor без аргументов, добавьте необязательные аргументы или сопоставьте все параметры конструктора ============================= AutoMapper создал эту карту типов для вас, но ваши типы не могут быть сопоставлены с использованием текущей конфигурации.Dog -> Pet (список участников-получателей) API.Core.Dog -> API.Core.Pet (список членов-получателей)

Не отображенные свойства: PetName AutoMapper.AutoMapperConfigurationException at lambda_method (Closure, Dog, Pet, ResolutionContext)в lambda_method (Closure, Object, Object, ResolutionContext) в API.Controllers.ValuesController.Get () в c: \ users \ greg \ Source \ Repos \ AutoMapperTest \ API \ Controllers \ ValuesController.cs: строка 26 в lambda_method (Closure,Object, Object []) в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor. <> C__DisplayClass10. b__9 (Экземпляр объекта, Object [] methodParameters) в System.Web.Http.Controllers.ReflectedHttpActionTextor(Экземпляр объекта, аргументы Object []) в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync (аргументы HttpControllerContext controllerContext, IDictionary`2, CancellationToken cancellationToken) --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение--- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Controllers.--- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Controllers.ActionFilterResult. d__2.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача Task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Dispatcher.HttpControllerDispatcher. d__1.MoveNext ()

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я столкнулся с той же проблемой (AutoMapper 7.0.0).Ключ к проблеме в сообщении об ошибке: «AutoMapper создал эту карту типов для вас, но ваши типы не могут быть сопоставлены с использованием текущей конфигурации».Начиная с 6.2.0, AutoMapper пытается самостоятельно создавать сопоставления для типов, которые явно не сопоставлены, т. Е. Во многих случаях для создания сопоставления больше не требуется.

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

Быстрый способ проверить это: вернитесь к версии 6.1.1 и посмотрите, сохраняется ли проблема.В моем случае понижение решило проблему.

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

0 голосов
/ 07 июня 2018

MapsToProperty для PetName класса Pet объявлен неправильно.Это должно быть typeof (Dog) вместо typeof (Pet).

    [MapsTo(typeof(Dog))]
    public class Pet
    {
        [MapsToProperty(typeof(Dog), "Name")]
        public string PetName { get; set; }
    }

Edit

Поскольку вы определили отображение для отображения Person на Customer, которое в вашем вопросеработал.Но в случае Dog вы определили отображение для Pet на Dog, но пытаетесь сопоставить объект dog с pet объектом (но отображение не существует).

Если вам требуется двухстороннее сопоставление, то вам будет предложено определить сопоставление с помощью MapsToAndFromProperty.

Проверьте эту ссылку для получения дополнительной информации.

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