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;

    }
4

3 回答 3

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);
            }
于 2016-12-08T09:16:40.083 回答
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 ;
于 2012-12-23T13:07:43.977 回答
0

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

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

于 2012-12-23T13:17:37.397 回答