Proveedor de datos MySQL: no se puede convertir un objeto de tipo 'System.Byte[]' para escribir 'System.IConvertible'

StackOverflow https://stackoverflow.com/questions/1401310

Pregunta

Tengo algunas dificultades con el contexto de Entity Framework y está resultando muy complicado depurarlo.Ayer agregué una característica a mi aplicación que le dio a una de mis entidades una colección adicional de entidades secundarias (llamadas Modelos) y después de actualizar una de mis expresiones a Incluir() esa colección cuando consulto el objeto principal, mi consulta falla una InvalidCastException cuando otra de las colecciones que funcionó bien antes está incluida ().

Unable to cast object of type 'System.Byte[]' to type 'System.IConvertible'

var b = DbEntities.Products.Include("Images").Include("Models").Include("Colors").FirstOrDefault(p => p.ID == id);

Jugué con la expresión y eliminé diferentes colecciones/cambié los elementos secundarios de Include() y descubrí que es esta combinación exacta de elementos la que causa la excepción antes mencionada.si elimino cualquier de esos Incluye() no hay excepción, pero con esos tres hijos hay uno cada vez que intento sacar un soltero Producto que tiene uno o mas entidad en el Colors recopilación.La excepción no se lanza si elimino FirstOrDefault(p => p.ID == id) o si el Colors la colección está vacía.

Parecería que la adición de la colección Models fue el punto de ruptura de mi consulta, pero realmente no estoy seguro de por qué.

La fuente exacta de la excepción es Mysql.Data y el seguimiento de la pila dice:

at MySql.Data.MySqlClient.MySqlDataReader.GetInt32(Int32 i)
at lambda_method(ExecutionScope , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator.HasNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.RowNestedResultEnumerator.MoveNext()
at System.Data.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.TryReadToNextElement()
at System.Data.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.ReadElement()
at System.Data.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable`1 sequence)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
at Data.ProductsRepository.GetProduct(Int32 id) in ProductsRepository.cs:line 65
at Web.Controllers.Areas.Admin.ProductsController.EditProduct(Int32 id) in ProductsController.cs:line 111
at lambda_method(ExecutionScope , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

Definiciones de entidad (solo campos relevantes)

Producto

  • int IDENTIFICACIÓN
  • EntityCollection<ProductColorOption> Colores
  • EntityCollection<ProductImage> Imágenes
  • EntityCollection<ProductModel> Modelos

Color del producto

  • int IDENTIFICACIÓN

OpciónColorProducto

  • int IDENTIFICACIÓN
  • int ID del Producto
  • int ProductoColorID

Modelo del Producto

  • int IDENTIFICACIÓN
  • int ID del Producto

Imagen del producto

  • int IDENTIFICACIÓN
  • int ID del Producto
  • sbyte? Orden

Relaciones

  • ID del Producto FK ImagenProducto.IDProducto (Uno a muchos)
  • ID del Producto FK ProductColorOption.ProductID (Uno a muchos)
  • ID del Producto FK ProductoModelo.ProductID (Uno a muchos)
  • ProductoColor.ID FK ProductColorOption.ProductColorID (Uno a muchos)

¡Gracias a todos!


Actualizar

La sugerencia de Gaustin a continuación soluciona el problema (no más excepciones), pero en realidad no aborda el problema real.Por esa razón voy a dejar la pregunta "sin respuesta".

Actualización 2

Ahora me doy cuenta de que el error no pertenece a Entity Framework, sino al proveedor de datos MySQL.Por alguna razón, trata ProductColor.ID como un byte [] y luego intenta convertirlo ciegamente a un int.Este no es un problema de Entity Framework en absoluto.Te maldigo Microsistemas solares ORÁCULO.

¿Fue útil?

Solución

¿Has probado la carga lenta de las inclusiones?

var product = DbEntities.Products.FirstOrDefault(p => p.Id == id);
product.Images.Load();

// ... and so on

Eso podría ser informativo.

Esto también parece ser un problema conocido . No estoy seguro de si hay una resolución conocida en este momento. Si lo hay, no puedo encontrarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top