MySQL数据提供程序 - 无法将类型为“System.Byte []”的对象转换为“System.IConvertible”类型

时间:2009-09-09 18:31:56

标签: c# mysql entity-framework exception iconvertible

我的实体框架上下文遇到了一些困难,这对调试来说非常麻烦。我昨天在我的应用程序中添加了一个功能,它为我的一个实体提供了一个额外的子实体集合(称为模型),并在我查询父对象时将我的一个表达式更新为Include()该集合后,我的查询失败了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()'d孩子,并发现这是导致上述异常的项目的精确组合。如果我删除那些Includes()中的任何,则没有例外,但每次我尝试拉出单个产品时,有三个孩子就有一个 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

  • int ID

ProductColorOption

  • int ID
  • int ProductID
  • int ProductColorID

产品型号

  • int ID
  • int ProductID

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

我现在意识到这个bug不是属于实体框架,而是属于MySQL数据提供者。由于某种原因,它将ProductColor.ID视为byte [],然后尝试将其盲目地转换为int。这根本不是实体框架问题。诅咒你 Sun Microsystems ORACLE。

1 个答案:

答案 0 :(得分:2)

您是否尝试过延迟加载包含?

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

// ... and so on

这可能是提供信息的。

这看起来也是known issue。我不确定目前是否有已知的分辨率。如果有,我找不到它。