簡體   English   中英

用戶代碼未處理實體異常

[英]entity exception was unhandled by user code

我在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;

    }

如果您想找到確切的問題所在,請以這種方式在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);
            }

首先檢查是否可以訪問數據源。 如果可以,則需要檢查查詢結構。 您正在遍歷查詢,而不是遍歷查詢結果。 使用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 ;

Adil的答案是正確的,可以解決您的問題,但是您可以考慮返回IEnumerable<ProductDTO>而不是IList<DTO>

遵循信息隱藏的原理,如果程序的其他調用GetProducts()的部分不需要列表語義,則它們不應看到IList<T>語義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM