在ASP中使用DTO和AutoMapper时, HttpPut.. NET核心API



在我的API项目中,我有Course模型:

public class Course
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CourseId { get; set; }
public string CourseName { get; set; }
[ForeignKey("Department")]
public int DepartmentId { get; set; }
public Department Department { get; set; }
public ICollection<CourseEnrollment> CourseEnrollments { get; set; }
public ICollection<CourseAssignment> CourseAssignments { get; set; }
}

我想将DTOAutoMapper概念应用于使用HttpPut的更新过程操作,所以我创建了一个CourseUpdateDtoDTO:

public class CourseUpdateDTO
{
[Required]
public int CourseId { get; set; }
[Required, MaxLength(100)]
public string CourseName { get; set; }
[Required]
public int DepartmentID { get; set; }
}

这是我的AutoMapper配置:

CreateMap<CourseUpdateDTO, Course>()
.ForMember(dest => dest.CourseId,
opts => opts.MapFrom(src => src.CourseId))
.ForMember(dest => dest.CourseName,
opts => opts.MapFrom(src => src.CourseName))
.ForMember(dest => dest.DepartmentId,
opts => opts.MapFrom(src => src.DepartmentID));

最后这是我尝试更新课程:

[HttpPut("{id:int}")]
public ActionResult PutCourse(int id, [FromBody] CourseUpdateDTO courseDto)
{
if (courseDto is null)
{
return BadRequest();
}
var entity = new Course
{
CourseId = id,
CourseName = courseDto.CourseName,
DepartmentId = courseDto.DepartmentID
};
_mapper.Map(courseDto, entity);
try
{
_unitOfWork.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
ModelState.AddModelError(nameof(PutCourse), "unable to save changes");
return StatusCode(500, ModelState);
}
return NoContent();
}

当我使用Postman测试这个动作时,它返回status of 204,但是过程没有改变。我错了吗?我对这个概念不熟悉,所以希望有人能给我配置一下。

在保存之前没有调用update方法。

映射后调用update方法和SaveChangesAsync();

首先,你需要从你的数据库中获得一个确切的记录(这里我的意思是从DbContext中获得它),然后将传入的数据映射到你的实体。

要使其工作,您必须应用如下更改:

var entity=_context.Cources.SingleOrDefault(x=>x.Id=id);
// check if it is not null 
_mapper.Map(courseDto, entity);
_context.Entity(entity).Status = Status.Modified;
_context.SaveChangesAsync();

在这篇文章中得到了一些人的建议。我已经改变了原来的动作

[HttpPut("{id:int}")]
public ActionResult PutCourse(int id, [FromBody] CourseUpdateDTO courseDto)
{
if (courseDto is null)
{
return BadRequest();
}
var entity = new Course
{
CourseId = id,
CourseName = courseDto.CourseName,
DepartmentId = courseDto.DepartmentID
};
_mapper.Map(courseDto, entity);
try
{
_unitOfWork.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
ModelState.AddModelError(nameof(PutCourse), "unable to save changes");
return StatusCode(500, ModelState);
}
return NoContent();
}

[HttpPut("{id:int}")]
public async Task<ActionResult> PutCourse(int id, [FromBody] CourseUpdateDTO courseDto)
{
if (courseDto is null)
{
return BadRequest();
}
var entity = _unitOfWork.CourseService.Get(id);
if (entity is null)
{
return NotFound();
}
_mapper.Map(courseDto, entity);
try
{
_unitOfWork.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
ModelState.AddModelError(nameof(PutCourse), "unable to save changes");
return StatusCode(500, ModelState);
}
return NoContent();
}

然而,它仍然不起作用。但我意识到问题可能是在使用async/await_unitOfWork.SaveChangesAsync();。但我没有将函数定义为async。因此,我将函数更改为async并添加awaitawait _unitOfWork.SaveChangesAsync();。终于成功了!非常感谢您的热情支持!

最新更新