Мой проект компилируется и запускается - просто не будет отображаться из одного типа в другой во время выполнения.Весь код и сообщение об ошибке показаны ниже.У кого-нибудь есть какие-либо идеи / вклад по этому вопросу?Заранее спасибо!
В моем файле 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 - правильный путь, и я думаю, что мы почти достигли решения для этого.