la excepción de entidad no fue manejada por el código de usuario

Recibo un error llamado "la excepción de entidad no fue manejada por el código de usuario" en el bucle foreach. ¿Por qué está pasando esto? ¿Qué estoy haciendo mal?

    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,
                                   };

El error ocurre justo en ella en el foreach.

                *foreach (var product in query)*
                {
                    listofproducts.Add(new ProductDTO { Name = product.Name });
                }
            }
        return listofproducts;

    }

preguntado el 23 de diciembre de 12 a las 13:12

Por favor, publique la excepción completa. -

3 Respuestas

Si desea encontrar el problema exacto, ¿dónde está el problema? Escriba el código en la instrucción try catch de esta manera.

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);
            }

Respondido el 08 de diciembre de 16 a las 09:12

En primer lugar, compruebe si puede acceder a la fuente de datos. Si está bien, debe verificar la estructura de su consulta. Está iterando a través de la consulta pero no a través de los resultados de la consulta. Use el método ToList para convertir la consulta a Lista para iterar a través de ella. Necesitas usar Enumerable.ToList método para convertir los resultados de la consulta a la lista.

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 });
}

Puede crear directamente objetos de ProductDTO utilizando la proyección.

IList<ProductDTO> listOfProcuts = (from p in db.Products
                                   select new ProductDTO 
                                   {
                                       Name = p.ProductName,
                                   }).ToList();

return listOfProcuts ;

Respondido el 23 de diciembre de 12 a las 13:12

Adil, está pasando lo mismo pero esta vez es ToList(); - Zaz

¿Puede colocar el bloque try catch alrededor del código que está obteniendo la excepción y verificar si se conecta correctamente con el contexto de datos de uso de la base de datos, hacer una consulta simple y verificar si funciona? desde p en db.Products seleccione p).ToList(); - Adil

Recibo el mismo error al final del código "to.list" y al comienzo del bucle foreach. - Zaz

La respuesta de Adil es correcta y resolvería tu problema, pero podrías considerar regresar IEnumerable<ProductDTO> en lugar de IList<DTO>.

Siguiendo el principio de ocultar información, si las otras partes del programa que llaman a GetProducts() no necesitan semántica de lista, entonces no deberían ver el IList<T> semántica

Respondido el 23 de diciembre de 12 a las 13:12

Sí y parece ser correcto, pero falta algo. No se muestran datos en WPF. - Zaz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.