基本上,我试图将具有一些属性的VehicleDTO转换为具有更多属性的车辆模型,因此当我映射它时,未映射的属性为空,当需要更新它时,这会导致一些错误,例如某些值不能为空,或者只是更新对象但清除以前的值并将它们设置为空。
我正在使用实体框架
/*AutoMapperProfile.cs*/
CreateMap<VehiculoDTO, Vehiculo>()
.ConvertUsing<MapeoVehiculosDTO_VehiculosTypeConverter>();
/*FuncionesMapeos.cs*/
public class MapeoVehiculosDTO_VehiculosTypeConverter : ITypeConverter<VehiculoDTO, Vehiculo> {
public Vehiculo Convert(VehiculoDTO source, Vehiculo destination, ResolutionContext context) {
destination = new();
if (source is not null) {
destination.Id = source.Id;
destination.Matricula = source.Matricula;
if (source.IdMarca is not null) {
destination.MarcaId = source.IdMarca;
}
if (source.IdModelo is not null) {
destination.ModeloId = source.IdModelo;
}
if (source.Id_TipoCombustible is not null) {
destination.TipoCombustibleId = source.Id_TipoCombustible;
}
destination.IdEmpresa = source.IdEmpresa;
}
return destination;
}
}
我尝试使用 IgnoreAllUnmapped 等函数,但总是得到相同的结果。
通常您不会使用自定义转换器来完成类似的操作,而是使用自定义成员映射定义:
CreateMap<VehiculoDTO, Vehiculo>()
.ForMember(destination => destination.MarcaId, o => o.MapFrom(source => source.IdMarca))
.ForMember(destination => destination.ModeloId, o => o.MapFrom(source => source.IdModelo))
.ForMember(destination => destination.TipoCombustibleId, o => o.MapFrom(source => source.Id_TipoCombustible));
其他值(
Id
和IdEmpresa
)应按约定处理,因为它们具有相同的名称。
如果您坚持使用自定义转换器,请尝试将第一行更改为
destination ??= new();
这样就可以了,因此仅创建一个新的目标对象,以防未提供任何目标对象。这应该可以解决您清除以前值的问题。