基本上,我通过引入 Employee Repository 处理所有数据库交互来分离代码。我的问题是我的代码执行指令,但随后抛出
System.InvalidOperationException:'序列不包含任何元素'。
我尝试按照建议使用FirstOrDefault
和SingelOrDefault
,但是我已经阅读了以前的文章,但是它执行了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("/");
}
}
答案 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");
}
}