Provedor MySQL dados - Incapaz de objeto fundido do tipo 'System.Byte []' para tipo 'System.IConvertible'
-
05-07-2019 - |
Pergunta
Eu estou tendo alguma dificuldade com meu contexto Entity Framework que está provando muito problemático para depurar. Eu adicionou um recurso ao meu pedido ontem que deu um dos meus entidades uma colecção de entidades filho (chamado Models) e depois de atualizar uma das minhas expressões para Incluir () que a coleta quando eu consulta para o objeto pai, minha consulta está falhando com um InvalidCastException quando outro uma das coleções que funcionou bem antes é Incluir () '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);
Eu brincava com a expressão e removido diferentes coleções / alterados os include () 'd crianças e descobriu que é esta combinação exata de itens que faz com que a exceção mencionada. Se eu remover qualquer daqueles Inclui () não há nenhuma exceção, mas com aquelas três crianças, há um cada vez que eu tente puxar um única produto que tem um ou mais entidade na coleção Colors
. A exceção não é lançada se eu remover o FirstOrDefault (p => p.ID == id) ou se a coleção Colors
está vazio.
Parece que a adição da coleção Models foi o ponto de ruptura para a minha consulta, mas estou realmente não sei porquê.
A fonte exata da exceção é Mysql.Data
eo stacktrace lê-se:
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)
Entidade Definições (campos relevantes apenas)
produtos
-
int
ID -
EntityCollection<ProductColorOption>
Cores -
EntityCollection<ProductImage>
Images -
EntityCollection<ProductModel>
Models
ProductColor
-
int
ID
ProductColorOption
-
int
ID -
int
ProductID -
int
ProductColorID
ProductModel
-
int
ID -
int
ProductID
productImage
-
int
ID -
int
ProductID -
sbyte?
Ordem
Relações
- Product.ID
FK
ProductImage.ProductID (um para muitos) - Product.ID
FK
ProductColorOption.ProductID (um para muitos) - Product.ID
FK
ProductModel.ProductID (um para muitos) - ProductColor.ID
FK
ProductColorOption.ProductColorID (um para muitos)
Obrigado a todos!
Atualizar
A sugestão de gaustin abaixo problema correções (não mais exceção), mas não realmente direcionar o problema real. Por essa razão eu vou deixar a questão 'sem resposta'.
Update 2
Eu percebo agora que pertence o bug não Entity Framework, mas sim ao Provedor MySQL dados. Por alguma razão, está tratando ProductColor.ID como um byte [] e, em seguida, tentando lançá-lo cegamente para um int. Este não é um problema Entity Framework em tudo. Vos maldizem Sun Microsystems ORACLE.
Solução
Você já tentou carregamento lento o inclui?
var product = DbEntities.Products.FirstOrDefault(p => p.Id == id);
product.Images.Load();
// ... and so on
Isso pode ser informativo.
Isso também parece ser um conhecido questão . Eu não tenho certeza se há uma resolução conhecida no momento. Se houver Eu não posso encontrá-lo.