2012-12-23 87 views
2

我在foreach循环中出现一个名为“实体异常未被用户代码处理”的错误。这是为什么发生?我究竟做错了什么?实体异常未被用户代码处理

public IList<ProductDTO> GetProducts() 
    { 
     IList<ProductDTO> listofproducts = new List<ProductDTO>(); 
     using (var db = new NORTHWNDEntities()) 
     { 
      var query = from p in db.Products 
         select new 
            { 
             Name = p.ProductName, 
            }; 

错误发生在她的foreach中。

   *foreach (var product in query)* 
       { 
        listofproducts.Add(new ProductDTO { Name = product.Name }); 
       } 
      } 
     return listofproducts; 

    } 
+0

请发布完整的例外。 –

回答

1

首先检查您是否可以访问数据源。如果没问题,那么你需要检查你的查询结构。您正在遍历查询,但不通过查询结果。使用ToList方法将查询转换为List来遍历它。您需要使用Enumerable.ToList方法将查询结果转换为列表。

var query = (from p in db.Products 
       select new 
       { 
        Name = p.ProductName, 
       }).ToList(); 

foreach (var product in query)* 
{ 
     listofproducts.Add(new ProductDTO { Name = product.Name }); 
} 

您可以使用投影直接创建ProductDTO的对象。

IList<ProductDTO> listOfProcuts = (from p in db.Products 
            select new ProductDTO 
            { 
             Name = p.ProductName, 
            }).ToList(); 

return listOfProcuts ; 
+0

Adil,同样的事情正在发生,但这次是ToList(); – Zaz

+0

你可以把try catch块放在你得到异常的代码周围,并检查你是否成功地建立了与数据库使用数据上下文的连接,做一个简单的查询并检查它是否工作。从p in db.Products select p).ToList(); – Adil

+0

我在代码“to.list”的末尾和foreach循环的开头处得到相同的错误。 – Zaz

0

阿迪尔的答案是正确的,并会解决你的问题,但你可能会考虑返回IEnumerable<ProductDTO>而不是IList<DTO>

以下信息隐藏的原则,如果调用的GetProducts(节目的)其他部分并不需要列表的语义,则他们不应该看到IList<T>语义

+0

是的,它似乎是正确的,但有一些缺失。没有数据显示在WPF中。 – Zaz

3

如果你想找到确切的问题,即是问题请用这种方式在try catch语句中编写代码

try 
{ 
    //write code 

} 
catch (System.Data.Entity.Validation.DbEntityValidationException ex) 
      { 
       var outputLines = new List<string>(); 
       foreach (var eve in ex.EntityValidationErrors) 
       { 
        outputLines.Add(string.Format(
         "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:", 
         DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State)); 
        foreach (var ve in eve.ValidationErrors) 
        { 
         outputLines.Add(string.Format(
          "- Property: \"{0}\", Error: \"{1}\"", 
          ve.PropertyName, ve.ErrorMessage)); 
        } 
       } 
       System.IO.File.AppendAllLines(@"c:\temp\errors.txt", outputLines); 
      } 
相关问题