将资源模型自动映射到 WebAPI 中的实体 - PUT 可为空

Automapping Resource model to Entity in WebAPI - PUT nullable

我正尝试在我的 EFCore 实体 class 上使用自动映射资源模型通过 WebAPI 修改数据。 我已经设法让 GET、GET(by id) 和 POST 使用此方法正常工作。

现在我面临的问题是在尝试使用此资源执行 PUT 时收到的 Automapper 可为空类型对错误消息。

这是我的实体:

[Table("BlazorWebApiDemo")]
    public partial class BlazorEntity
    {
        [Key]
        public int Id { get; set; }
        [Column("First Name")]
        [StringLength(50)]
        public string? FirstName { get; set; }
        [Column("Last Name")]
        [StringLength(50)]
        public string? LastName { get; set; }
        [StringLength(50)]
        public string? Address { get; set; }
    } 

这是我的资源模型:

    public class BlazorEntityModel
    {
        [Key]
        public int Id { get; set; }
        [StringLength(50)]
        public string FirstName { get; set; }
        [StringLength(50)]
        public string LastName { get; set; }
        [StringLength(50)]
        public string Address { get; set; }
    }

我的 Automapper 配置文件:

    public class BlazorEntityProfile : Profile
    {
        public BlazorEntityProfile()
        {
            this.CreateMap<BlazorEntity, BlazorEntityModel>()
                .ForMember(dest => dest.FirstName, opt => opt.NullSubstitute(""))
                .ForMember(dest => dest.LastName, opt => opt.NullSubstitute(""))
                .ForMember(dest => dest.Address, opt => opt.NullSubstitute(""));
        }
    }

注意:我已经为每个成员添加了 NullSubstitute,因为我认为这会解决错误。没有。

还有我在 API 控制器中的 PUT 方法。

        [HttpPut("id:int")]
        public async Task<ActionResult<BlazorEntityModel>> UpdateBlazorItem(int id, BlazorEntityModel blazorEntityModel)
        {
            try
            {
                var updatedBlazorEntity = await blazorRepository.GetBlazorById(id);
                if (blazorEntityModel == null) return NotFound($"LetItem with the ID: {id} not found");

                mapper.Map(blazorEntityModel, updatedBlazorEntity);

                if(await blazorRepository.SaveChangesAsync())
                {
                    return mapper.Map<BlazorEntityModel>(updatedBlazorEntity);
                }

            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError,
                                  e);
            }

            return BadRequest();
        }

注意: blazorRepository.GetBlazorById(id) 检索 BlazorEntity。

SaveChangesAsync

        public async Task<bool> SaveChangesAsync()
        {
            return await(context.SaveChangesAsync()) > 0;
        }

Swagger 测试:

错误信息:

有什么想法吗?

你在Mapper Profile上的代码是反的,试试把this.CreateMap<BlazorEntity, BlazorEntityModel>()改成this.CreateMap<BlazorEntityModel, BlazorEntity>()

或者您可以使用 .ReverseMap() 以两种方式使用此配置

this.CreateMap<BlazorEntity, BlazorEntityModel>()
    .ForMember(dest => dest.FirstName, opt => opt.NullSubstitute(""))
    .ForMember(dest => dest.LastName, opt => opt.NullSubstitute(""))
    .ForMember(dest => dest.Address, opt => opt.NullSubstitute(""))
    .ReverseMap();

注意:您不需要将 string 指定为 string?,因为 string 已经是可空类型