在ASP.NET Core中删除对象时的异常处理

时间:2018-11-24 01:35:34

标签: c# asp.net-core entity-framework-6

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

  

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

我尝试按照建议使用FirstOrDefaultSingelOrDefault,但是我已经阅读了以前的文章,但是它执行了remove操作并抛出

  

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("/");
        }
    }

2 个答案:

答案 0 :(得分:0)

正如罗斯·布什指出的那样,如果谓词(c => c.EmployeeID == employeeId)在您的方法仅为“单一”时产生0个结果,则JohnB提到的代码行将引发无效的操作异常。如果您输入“ SingleOrDefault”,则结果将为空。因此,“ removeEmployee”将为空。当您访问removeEmployee下现在为空的任何成员(例如“ removeEmployee.WorkStatus”)时,它将抛出空引用异常。

我不确定您的代码之前如何工作。您的第一个代码版本具有context.Employees,但是您的修改后的版本具有context.Employees。我怀疑那里正在发生某些事情,或者可能是当您使用原始代码进行测试时,可能有一些数据

答案 1 :(得分:0)

感谢所有困扰我的问题并试图帮助我找到解决方案的人。我的代码的问题实际上与“ 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");
            }
        }