我在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 :(得分: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>
语义