2012-12-23 36 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); 
      } 
相關問題