Provider di dati MySQL - Impossibile eseguire il cast di oggetti di tipo "System.Byte []" per digitare "System.IConvertible"

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

Domanda

Ho qualche difficoltà con il mio contesto Entity Framework che si sta rivelando molto problematico per il debug. Ieri ho aggiunto una funzione alla mia applicazione che ha fornito a una delle mie entità una raccolta aggiuntiva di entità figlio (denominata Modelli) e dopo aver aggiornato una delle mie espressioni in Include () quella raccolta quando eseguo una query per l'oggetto padre, la mia query non riesce un InvalidCastException quando un'altra delle raccolte che ha funzionato bene prima è 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);

Ho armeggiato con l'espressione e rimosso diverse raccolte / modificato i figli di Include () e ho scoperto che è questa esatta combinazione di elementi che causa la suddetta eccezione. Se rimuovo qualsiasi di tali Include () non fa eccezione, ma con quei tre figli ce n'è uno ogni volta che provo a estrarre un singolo che ha una o più entità nella raccolta Colors. L'eccezione non viene generata se rimuovo FirstOrDefault (p = & Gt; p.ID == id) o se la raccolta Mysql.Data è vuota.

Sembrerebbe che l'aggiunta della collezione Models sia stata il punto di rottura per la mia query, ma non sono davvero sicuro del perché.

La fonte esatta dell'eccezione è int e lo stacktrace recita:

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)

Definizioni entità (solo campi pertinenti)

prodotto

  • EntityCollection<ProductColorOption> ID
  • EntityCollection<ProductImage> Colori
  • EntityCollection<ProductModel> Immagini
  • sbyte? Modelli

ProductColor

  • FK ID

ProductColorOption

  • <=> ID
  • <=> ProductID
  • <=> ProductColorID

ProductModel

  • <=> ID
  • <=> ProductID

productimage

  • <=> ID
  • <=> ProductID
  • <=> Ordine

Rapporti

  • Product.ID <=> ProductImage.ProductID (Uno a molti)
  • Product.ID <=> ProductColorOption.ProductID (Uno a molti)
  • Product.ID <=> ProductModel.ProductID (Uno a molti)
  • ProductColor.ID <=> ProductColorOption.ProductColorID (Uno a molti)

Grazie a tutti!


Aggiorna

Il suggerimento di gaustin di seguito risolve il problema (niente più eccezioni), ma non risolve realmente il problema reale. Per questo motivo lascerò la domanda "senza risposta".

Aggiornamento 2

Ora mi rendo conto che il bug non riguarda Entity Framework, ma piuttosto il provider di dati MySQL. Per qualche ragione sta trattando ProductColor.ID come un byte [] e quindi sta provando a lanciarlo alla cieca in un int. Questo non è affatto un problema di Entity Framework. Ti maledico Sun Microsystems ORACLE.

È stato utile?

Soluzione

Hai provato a caricare lentamente le inclusioni?

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

// ... and so on

Potrebbe essere informativo.

Anche questo sembra essere un problema noto . Non sono sicuro che al momento esista una risoluzione nota. Se c'è non riesco a trovarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top