用户代码未处理实体异常



我在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:temperrors.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>语义

相关内容

  • 没有找到相关文章