在我的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; }
}
我想将DTO
和AutoMapper
概念应用于使用HttpPut
的更新过程操作,所以我创建了一个CourseUpdateDto
DTO:
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();
。终于成功了!非常感谢您的热情支持!