У меня возникли некоторые трудности с контекстом Entity Framework, который очень сложно отлаживать. Вчера я добавил в свое приложение функцию, которая дала одной из моих сущностей дополнительную коллекцию дочерних сущностей (называемых моделями), и после обновления одного из моих выражений на Включить () эту коллекцию, когда я запрашиваю родительский объект, мой запрос завершается с ошибкой InvalidCastException, когда другой из коллекций, которая раньше работала нормально, является Include () 'd.
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 () и обнаружил, что именно эта комбинация элементов вызывает вышеупомянутое исключение. Если я удаляю любой из этих Включенных (), исключений не будет, но с этими тремя детьми, каждый раз, когда я пытаюсь вытащить одиночный Продукт, который имеет один или подробнее сущность в коллекции Colors
. Исключение не выдается, если я удаляю FirstOrDefault (p => p.ID == id) или если коллекция Colors
пуста.
Казалось бы, добавление коллекции Models стало переломным моментом для моего запроса, но я действительно не уверен, почему.
Точный источник исключения - 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
ID
EntityCollection<ProductColorOption>
Цвета
EntityCollection<ProductImage>
Изображения
EntityCollection<ProductModel>
Модели
ProductColor
ProductColorOption
int
ID
int
ProductID
int
ProductColorID
ProductModel
ProductImage
int
ID
int
ProductID
sbyte?
Заказ
Отношения
- Product.ID
FK
ProductImage.ProductID (один ко многим)
- Product.ID
FK
ProductColorOption.ProductID (один ко многим)
- Product.ID
FK
ProductModel.ProductID (один ко многим)
- ProductColor.ID
FK
ProductColorOption.ProductColorID (один ко многим)
Спасибо всем!
Обновление
Предложение gaustin ниже устраняет проблему (не исключение), но на самом деле не нацелено на реальную проблему. По этой причине я оставлю вопрос без ответа.
Обновление 2
Теперь я понимаю, что ошибка относится не к Entity Framework, а скорее к провайдеру данных MySQL. По какой-то причине он обрабатывает ProductColor.ID как байт [], а затем пытается слепо привести его к типу int. Это не проблема Entity Framework вообще. Проклинаю тебя Sun Microsystems ОРАКУЛ.