对于班级的删除,不能像删除学生一样找到数据就直接删除,而是需要判断此班级中是否存在学生,如果存在学生,则不允许删除班级。
在ClassRepo中添加GetWithStudents方法,代码如下:
public Class? GetWithStudents(Guid id)
{
return DbSet.Include(c => c.Students).SingleOrDefault(c => c.Id == id);
}
通过此方法,可以加载导航中的Students数据,从而判断是否存在学生。
在ClassService中添加Delete方法。
首先判断是否能找到要被删除的数据,如果找不到,就抛出空引用异常。
然后判断班级中是否含有学生,如果有,就抛出非法操作异常。
否则,就删除该数据。
代码如下:
public void Delete(Guid id)
{
Class? @class = classRepo.GetWithStudents(id);
if (@class == null)
{
throw new NullReferenceException("未找到该班级,无法删除");
}
if (@class.Students.Any())
{
throw new InvalidOperationException("班级中存在学生,无法删除");
}
classRepo.Delete(@class);
}
在ClassController创建Delete动作,代码如下:
public IActionResult Delete(Guid id)
{
try
{
classService.Delete(id);
return Ok("删除成功");
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
首先添加删除按钮,代码如下:
<button class="button is-danger" onclick="Delete('@clazz.Id')">删除</button>
然后添加Delete函数,代码如下:
@section Scripts {
<script>
function Delete(id) {
DeleteWithController(id, 'Class');
}
</script>
}
此时,如果删除存在学生的班级,则会显示删除失败。