实体异常未被用户代码处理

时间:2012-12-23 13:05:46

标签: c# linq exception foreach dto

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

    }

3 个答案:

答案 0 :(得分: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);
            }

答案 1 :(得分: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 ;

答案 2 :(得分:0)

Adil的回答是正确的,可以解决您的问题,但您可以考虑返回IEnumerable<ProductDTO>而不是IList<DTO>

遵循信息隐藏原则,如果调用GetProducts()的程序的其他部分不需要列表语义,那么它们就不应该看到IList<T>语义