使用 AutoMapper 进行 C# 更新

问题描述 投票:0回答:1

基本上,我试图将具有一些属性的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 等函数,但总是得到相同的结果。

asp.net entity-framework
1个回答
0
投票

通常您不会使用自定义转换器来完成类似的操作,而是使用自定义成员映射定义:

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();

这样就可以了,因此仅创建一个新的目标对象,以防未提供任何目标对象。这应该可以解决您清除以前值的问题。

© www.soinside.com 2019 - 2024. All rights reserved.