System.InvalidOperationException当试图从数据库中获取数据

问题描述:

我是相当新的MVC和EF,我试图从我的数据库中显示数据到我的视图。这是我的行动:System.InvalidOperationException当试图从数据库中获取数据

public ActionResult MalfunctionsList(MalfunctionDTO malfunctionDTO) 
    { 
     var malfunctions = _context.Malfunctions.ToList(); 
     var customer = _context.Malfunctions.Single(c => c.Id == malfunctionDTO.CustomerId); 
     var movie = _context.Malfunctions.Where(m => malfunctionDTO.MovieIds.Contains(m.Id)).ToList(); 

     return View(malfunctions); 
    } 

当代码运行,我得到System.InvalidOperationException:序列不包含在此行中没有的元素:

var customer = _context.Malfunctions.Single(c => c.Id == malfunctionDTO.CustomerId); 

这是我的DTO:

public class MalfunctionDTO 
{ 
    public int CustomerId { get; set; } 

    public List<int> MovieIds { get; set; } 

    public Customer Customer { get; set; } 

    public Movie Movie { get; set; } 

    public string ReportDescription { get; set; } 

} 

在我数据库中的表customerId不为空。

好像在Malfunctions这个查询查找没有元素

Malfunctions.Single(c => c.Id == malfunctionDTO.CustomerId); 

尝试一些项目

.SingleOrDefault() 

单(条件),是一个LINQ扩展方法返回匹配的一个和唯一的元件传入的条件。 如果没有匹配条件的元素或匹配的多个元素,则会引发错误。 在你的情况下,你的数据库中没有与这种情况相匹配的元素。 顺便说一句,你可以使用singleOrDefault而不是抛出异常它返回默认值,null。或者也许在单个方法之前,函数没有包含任何内容,所以它不能迭代任何东西。

+0

SingleOrDefault()返回空值,为什么它返回一个空值,如果它在我的表中有一个值? – IlirAs

+0

正如我所说,如果你确定条件是真的,那么请确保有一个元素(不超过1),否则它将返回null。否则,你应该调试程序,看看有什么事情,var varunctions在ToList()后面保留一个空列表? –

+0

在数据库表中,可以有多个具有相同customerId的项目。调试器显示,var malfunctions不是空它包含_context.Malfunctions – IlirAs