Поставщик данных MySQL – невозможно привести объект типа «System.Byte[]» к типу «System.IConvertible».
-
05-07-2019 - |
Вопрос
У меня возникли трудности с контекстом Entity Framework, отладка которого очень затруднительна.Вчера я добавил в свое приложение функцию, которая предоставила одному из моих объектов дополнительную коллекцию дочерних объектов (называемых моделями), и после обновления одного из моих выражений до Include() этой коллекции, когда я запрашиваю родительский объект, мой запрос терпит неудачу с ошибкой InvalidCastException, когда другая из коллекций, которая раньше работала нормально, вызывается Include().
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);
Я поигрался с выражением и удалил различные коллекции/изменил дочерние элементы Include() и обнаружил, что именно эта комбинация элементов вызывает вышеупомянутое исключение.Если я удалю любой из этих методов include() не является исключением, но с этими тремя дочерними элементами каждый раз, когда я пытаюсь вытащить одинокий Продукт, имеющий один или больше субъект в Colors
коллекция.Исключение не генерируется, если я удалю FirstOrDefault(p => p.ID == id) или если Colors
коллекция пуста.
Казалось бы, добавление коллекции «Модели» стало переломным моментом в моем запросе, но я действительно не понимаю, почему.
Точный источник исключения: Mysql.Data
и трассировка стека гласит:
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)
Определения сущностей (только соответствующие поля)
Продукт
int
ИДЕНТИФИКАТОРEntityCollection<ProductColorOption>
ЦветаEntityCollection<ProductImage>
ИзображенийEntityCollection<ProductModel>
Модели
Цвет продукта
int
ИДЕНТИФИКАТОР
Вариант цвета продукта
int
ИДЕНТИФИКАТОРint
Идантификационный номер продуктаint
ProductColorID
Модель продукта
int
ИДЕНТИФИКАТОРint
Идантификационный номер продукта
Изображение продукта
int
ИДЕНТИФИКАТОРint
Идантификационный номер продуктаsbyte?
Заказ
Отношения
- Идантификационный номер продукта
FK
ProductImage.ProductID (Один ко многим) - Идантификационный номер продукта
FK
ProductColorOption.ProductID (Один ко многим) - Идантификационный номер продукта
FK
ПродуктМодель.ПродуктИД (Один ко многим) - ProductColor.ID
FK
ProductColorOption.ProductColorID (Один ко многим)
Спасибо всем!
Обновлять
Предложение Гаустина ниже устраняет проблему (больше не является исключением), но на самом деле не касается реальной проблемы.По этой причине я оставлю вопрос «без ответа».
Обновление 2
Теперь я понимаю, что ошибка связана не с Entity Framework, а с поставщиком данных MySQL.По какой-то причине он обрабатывает ProductColor.ID как byte[], а затем пытается слепо привести его к int.Это вообще не проблема Entity Framework.Будь ты проклят Сан Микросистемс ОРАКУЛ.
Решение
Вы пробовали ленивую загрузку включений?
var product = DbEntities.Products.FirstOrDefault(p => p.Id == id);
product.Images.Load();
// ... and so on
Это может быть информативно.
Это также выглядит известная проблема.Я не уверен, существует ли известное решение на данный момент.Если есть, то не могу найти.