c# - Automapper - 将一种类型映射到另一种类型时出现问题
问题描述
我的项目编译并运行——只是在运行时不会从一种类型映射到另一种类型。所有代码和错误消息如下所示。有人对此有任何想法/意见吗?提前致谢!
我的 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;}
}
执行映射时,我看到以下消息:-
未映射的成员被发现。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,添加无参数 ctor、添加可选参数或映射所有构造函数参数
编辑- 根据 Hien Nguyen 的有用建议,我使用 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();
});
这将使用我的解析器从视图模型中获取相关 ID 并检索模型所需的正确对象。以下是在 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.dll 中发生“AutoMapper.AutoMapperMappingException”类型的异常最内部异常 System.MissingMethodException:没有为此对象定义无参数构造函数
你知道是什么原因造成的吗?我genuinley觉得使用'ForMember'的原始建议是正确的方法,并且认为我们几乎可以解决这个问题。
解决方案
您的模型和视图模型具有不同类型的属性。您可以使用 ForMember 来自定义属性之间的映射。
请参阅此自定义映射属性 如何在 AutoMapper 中处理自定义属性
推荐阅读
- mongodb - 我们可以使用 mongodb 将对象值推送到 $project 中吗
- python - 如何根据文件夹名称命名图例中的图形
- docker - Docker 中的 .NET Core,过期的 SSL CA 证书
- python - 我的 python IDE 无法运行我的文件。我该如何解决?
- java - 通过 nginx 的 Webflux 媒体流有时会失败
- youtube-api - Youtube API v3 - 管理其他人拥有的频道
- html - 根据Angular中的id获取多个Toggle Button值?
- linux - 无法在 ec2(主机)到 Mac(目标机)中运行 ansible playbook
- typescript - 函数重载与实现不兼容
- php - 使用 GMB API 将媒体添加到 GMB 位置会出现错误