Automapper - проблема при отображении одного типа в другой - PullRequest
0 голосов
/ 01 марта 2019

Мой проект компилируется и запускается - просто не будет отображаться из одного типа в другой во время выполнения.Весь код и сообщение об ошибке показаны ниже.У кого-нибудь есть какие-либо идеи / вклад по этому вопросу?Заранее спасибо!

В моем файле startup.cs (метод настройки) есть следующий код: -

Mapper.Initialize(config =>
{
    config.CreateMap<VehicleViewModel, Vehicle>().ReverseMap();
});

, который, на мой взгляд, создает двустороннее сопоставление между VehicleViewModel и Vehicle.

код для VehicleViewMOdel указан ниже: -

public class VehicleViewModel
{
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [Required]
    public int ModelForeignKey {get;set;}
    [Required]
    public int DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}

Для полноты код для Vehicle приведен ниже: -

public class Vehicle
{
    [Key]
    public int Id {get; set;}
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [ForeignKey("VehicleModelId")]
    public virtual VehicleModels ModelForeignKey {get;set;}
    [ForeignKey("VehicleDealerId")]
    public virtual Dealer DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}

при выполнении отображения,Я вижу следующее сообщение: -

Найдены несопоставленные участники.Просмотрите типы и членов ниже.Добавление пользовательского выражения сопоставления, игнорирование, добавление настраиваемого преобразователя или изменение типа источника / назначения. Если нет подходящего конструктора, добавьте c-аргумент без аргументов, добавьте необязательные аргументы или сопоставьте все параметры конструктора

РЕДАКТИРОВАТЬ - согласно полезному предложению Хьена Нгуена, я использовал ForMember для сопоставления членов, которые бывают разных типов: -

Mapper.Initialize(config =>
        {
            config.CreateMap<VehicleViewModel, Vehicle>()
            .ForMember(dest => dest.DealerForeignKey, opt => opt.MapFrom<DealerResolver>())
            .ForMember(dest => dest.ModelForeignKey, opt => opt.MapFrom<VehicleModelResolver>()).ReverseMap();
        });

это будет использовать мои решатели, чтобы взять соответствующий идентификатор изпросмотреть модель и получить правильный объект, который необходим модели.Вот код, который работает в DealerResolver, например: -

public Dealer Resolve(VehicleViewModel source, Vehicle destination, Dealer destMember, ResolutionContext context)
    {
        List<Dealer> dealers = _vehicleRepo.GetDealerById(source.DealerForeignKey).ToList();
        return dealers.FirstOrDefault();
    }

Я использовал очень похожую идею для VehicleModelResolver.

Пока все хорошо.

Единственная проблема состоит в том, что когда я запускаю код и пытаюсь выполнить сопоставление, я теперь вижу другое сообщение об ошибке все вместе: -

Исключение типа 'AutoMapper.AutoMapperMappingException' произошло в AutoMapper.dll Внутреннее исключениеSystem.MissingMethodException: для этого объекта не определен конструктор без параметров

Есть ли у вас какие-либо представления о причинах этого?Я полагаю, что первоначальное предложение использовать ForMember - правильный путь, и я думаю, что мы почти достигли решения для этого.

1 Ответ

0 голосов
/ 01 марта 2019

Ваша модель и модель представления имеют свойства с другим типом.Вы можете использовать ForMember для настраиваемого сопоставления между свойством.

См. Это для настраиваемого сопоставления для свойства Как обрабатывать настраиваемые свойства в AutoMapper

...