Обработка исключений при удалении объекта в ASP.NET Core - PullRequest
0 голосов
/ 24 ноября 2018

По сути, я отделил свой код, введя Репозиторий сотрудников для обработки всего взаимодействия с базой данных.Моя проблема в том, что мой код выполняет инструкции, но затем выдает

System.InvalidOperationException: «Последовательность не содержит элементов».

Я пытался использовать FirstOrDefault и SingelOrDefault как и предполагалось, но в предыдущих постах я читал, но он выполняет операцию удаления и выдает

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 голосов
/ 26 ноября 2018

Спасибо всем, кто удосужился взглянуть на мою проблему и попытался помочь мне найти решение.Проблема с моим кодом на самом деле была связана с логикой в ​​моем методе «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");
            }
        }
0 голосов
/ 24 ноября 2018

Как указал Росс Буш, строка кода, упомянутая JohnB, выдает недопустимое исключение операции, если предикат (c => c.EmployeeID == employeeId) дает 0 результатов, когда ваш метод просто «Single».Если вы установите 'SingleOrDefault', результат будет нулевым.Так что «removeEmployee» будет нулевым.Когда вы обращаетесь к любому члену в removeEmployee, который теперь имеет значение null (например, «removeEmployee.WorkStatus»), он выдаст исключение нулевой ссылки.

Я не уверен, как ваш код работал раньше.Ваша первая версия кода имеет context.Employee, но ваша измененная версия имеет context.Employees.Я подозреваю, что там что-то происходит, или может случиться так, что при тестировании с исходным кодом, возможно, были некоторые данные

...