首页 > 解决方案 > 在 ASP.NET Core 中删除对象时的异常处理

问题描述

基本上,我通过引入Employee Repository来处理所有数据库交互来解耦我的代码。我的问题是我的代码执行指令但随后抛出

System.InvalidOperationException:“序列不包含任何元素”。

我已经尝试使用FirstOrDefaultandSingelOrDefault按照建议但我读过以前的帖子,但它执行删除操作并抛出

System.NullReferenceException:“对象引用未设置为对象的实例。”

removeEmployee为空。有人可以帮我解释一下如何解决它

这是我正在尝试重构的代码,并且此初始代码可以正常工作而不会引发异常:

[HttpPost]
public IActionResult Remove(int[] employeeIds)
{ 

    foreach (int employeeId in employeeIds)
    {
        Employee removeEmployee = context.Employees.Single(c => c.EmployeeID == employeeId);

        if (removeEmployee.WorkStatus == "Available")
        {
           context.Employee.Remove(removeEmployee);
        }
        else
        {
           return Redirect("/Employee/Remove");
        }

   }
   context.SaveChanges();
   return Redirect("/");
}

以下是我尝试重构代码的方式。

员工资料库:

 public bool RemoveEmployee(int[] employeeIds)
    {
        foreach (int employeeId in employeeIds)
        {
            Employee removeEmployee = context.Employees.Single(c => c.EmployeeID == employeeId);

            if (removeEmployee.WorkStatus == "Available")
            {
                context.Employees.Remove(removeEmployee);
            }
            else
            {
                return false;
            }
        }
        context.SaveChanges();
        return true;
    }

员工控制器:

private IEmployeesRepository repo;

    public EmployeeController(IEmployeesRepository repo)
    {
        this.repo = repo;
    }

 [HttpPost]
    public IActionResult Remove(int[] employeeIds)
    {
        repo.RemoveEmployee(employeeIds);

        if (repo.RemoveEmployee(employeeIds) == false)
        {
            return Redirect("/Employee/Remove");
        }
        else
        {
            return Redirect("/");
        }
    }

标签: c#asp.net-coreentity-framework-6

解决方案


感谢所有费心查看我的问题并试图帮助我找到解决方案的人。我的代码的问题实际上与我的“RemoveEmployee”方法中的逻辑和返回的布尔值有关。以下是我想出的解决方案。

员工资料库:

public bool RemoveEmployee(int[] employeeIds)
        {
            foreach (int employeeId in employeeIds)
            {
                Employee removeEmployee = context.Employees.Single(c => c.EmployeeID == employeeId); 
                if (removeEmployee !=null && removeEmployee.WorkStatus == "Available")
                {
                    context.Employees.Remove(removeEmployee);
                    context.SaveChanges();
                    return true;
                }        
            }
            return false;
        }

员工控制器:

[HttpPost]
        public IActionResult Remove(int[] employeeIds)
        {                   
            if (repo.RemoveEmployee(employeeIds) == false)
            {
                return Redirect("/Employee/Remove");
            }
            else
            {
                return Redirect("/Employee");
            }
        }

推荐阅读