将资源模型自动映射到 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
已经是可空类型
我正尝试在我的 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
已经是可空类型