Automapper Не найдены участники - PullRequest
0 голосов
/ 26 сентября 2018

Схожу с ума ...

Модель:

public class CountryModel
{
    public int Id { get; set; }

    [Required (ErrorMessage = "A value is required")]
    [StringLength(30, MinimumLength = 4, ErrorMessage = "Minimum value is 4 characters")]
    public string Name { get; set; }
}

ENTITFRAMEWORK DB MODEL

public partial class Country
{
    public Country()
    {
        this.City = new HashSet<City>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<City> City { get; set; }
}

Mapper:

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Country, CountryModel>();
                cfg.CreateMap<CountryModel, Country>().ForMember(x=> x.City, opt => opt.Ignore());
            }
        );
    }
}

Failsпо городу ... что я делаю не так?

РЕДАКТИРОВАТЬ: Использование Automapper V7.0.1

EDIT2:

Отображение так:

    public int AddCountry(CountryModel model)
    {
        var mappedC = _mapper.Map<CountryModel, Country>(model);

        int countryId = _locationManager.AddCountry(mappedC);

        return 1;
    }

Я сопоставляю из Countrymodel (источник) в страну(пункт назначения)

РЕДАКТ. 3:

Сообщение об ошибке:

Найдены несопоставленные элементы.Просмотрите типы и членов ниже.Добавьте пользовательское выражение сопоставления, игнорируйте, добавьте пользовательский преобразователь или измените тип источника / назначения. Если нет подходящего конструктора, добавьте c-аргумент без аргументов, добавьте необязательные аргументы или сопоставьте все параметры конструктора ===================================================================== AutoMapper создал эту карту типов для вас, но ваши типы не могут быть сопоставлены с использованием текущей конфигурации.CountryModel -> Country (Список участников-получателей) NetworkTool.Models.Location.CountryModel -> NetworkTool.Data.Country (Список участников-получателей)

Несопоставленные свойства: Город

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Следовал Это руководство по automaper + Structuremap

В реестре по умолчанию у меня было следующее:

    var config = new MapperConfiguration(cfg =>
    {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
    });

    //Create a mapper that will be used by the DI container
    var mapper = config.CreateMapper();

    //Register the DI interfaces with their implementation
    For<IMapperConfiguration>().Use(config);
    For<IMapper>().Use(mapper);

Это явно изменило мои настройки автопереключателя.

Я должен был изменить его на:

var mapper = AutoMapperConfiguration.Configure();

For<IMapper>().Use(mapper.CreateMapper());

И изменил мое начальное отображение на:

public class AutoMapperConfiguration
{
    public static MapperConfiguration Configure()
    {
        var mapper = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Country, CountryModel>();
                cfg.CreateMap<CountryModel, Country>().ForMember(x => x.City, opt => opt.Ignore());
            }
        );

        return mapper;
    }
}

Тогда мои отображения окончательно сработали

0 голосов
/ 26 сентября 2018

Код отображения у вас в порядке и должен работать нормально, если все настроено правильно.Я считаю, что проблема, с которой вы столкнулись, заключается в том, что, хотя вы правильно настроили AM для своего примера, фактический картограф, выполняющий работу по переводу из модели в сущность, не использует вашу фактическую конфигурацию.Как и Эрик, я запустил код, который вы предоставили, и он работает нормально .... если я не закомментирую фактическое отображение в конфигурации.Я думаю, что причина, по которой вы получаете это исключение, заключается в том, что AM пытается конвертировать, используя свое собственное соглашение о соответствии, а не определенное отображение.AM может определить Id и Name автоматически без настройки, но не работает в городе.Вы должны убедиться, что ваш _mapper действительно указывает на «настроенный преобразователь».

Если я запускаю это (как у вас есть), код работает нормально.

public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Country, CountryModel>();
            cfg.CreateMap<CountryModel, Country>();.ForMember(x => x.City, opt => opt.Ignore());
        });
    }

ЕслиЯ запускаю это (с закомментированным сопоставлением), оно выдаст исключение, не отображенное на карту.

public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Country, CountryModel>();
            //cfg.CreateMap<CountryModel, Country>();.ForMember(x => x.City, opt => opt.Ignore());
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...