代码之家  ›  专栏  ›  技术社区  ›  Nathan Taylor

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

  •  0
  • Nathan Taylor  · 技术社区  · 17 年前

    在我的实体框架上下文中,我遇到了一些困难,这使得调试非常麻烦。我昨天向我的应用程序添加了一个特性,它为我的一个实体提供了一个附加的子实体集合(称为模型),在更新了我的表达式之一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),或者如果 颜色 集合为空。

    似乎添加模型集合是我查询的转折点,但我真的不知道为什么。

    异常的确切来源是 Mysql.Data stacktrace显示:

    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 身份证件
    • int 产品目录

    生产能力

    • int 身份证件
    • int 产品目录
    • sbyte? 秩序

    关系

    • 产品ID FK 产品图像.productID (一对多)
    • 产品ID FK 产品颜色选项.productID (一对多)
    • 产品ID FK 产品型号.productID (一对多)
    • 产品颜色.id FK 产品颜色选项。产品颜色 (一对多)

    谢谢大家!


    更新

    下面的Gaustin建议解决了问题(不再例外),但并没有真正针对实际问题。因为这个原因,我要留下这个问题“未回答”。

    更新2

    我现在意识到这个bug不属于实体框架,而是属于MySQL数据提供者。出于某种原因,它将productcolor.id视为byte[],然后试图将其盲目强制转换为int。这根本不是实体框架问题。诅咒你 太阳微系统 神谕。

    1 回复  |  直到 15 年前
        1
  •  2
  •   gaustin    17 年前

    您是否尝试过延迟加载include?

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

    这也许能提供信息。

    这看起来也是一个 known issue . 我不确定目前是否有已知的解决方案。如果有,我找不到。