0

我的实体框架上下文遇到了一些困难,这证明调试起来非常麻烦。我昨天向我的应用程序添加了一项功能,该功能为我的一个实体提供了一个额外的子实体集合(称为模型),并且在我查询父对象时将我的一个表达式更新为 Include() 该集合后,我的查询失败了当另一个之前运行良好的集合是 Include()'d 时,会出现 InvalidCastException。

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() 的子项,发现正是这种精确的项目组合导致了上述异常。如果我删除其中任何一个 Includes() 也不例外,但是对于这三个孩子,每次我尝试拉出在集合中具有一个或多个实体的单个产品时都会有一个。如果我删除 FirstOrDefault(p => p.ID == id) 或集合为空,则不会引发异常。ColorsColors

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

异常的确切来源是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)

实体定义(仅限相关字段)

产品

  • intID
  • EntityCollection<ProductColorOption>颜色
  • EntityCollection<ProductImage>图片
  • EntityCollection<ProductModel>楷模

产品颜色

  • intID

产品颜色选项

  • intID
  • int产品编号
  • int产品颜色ID

产品型号

  • intID
  • int产品编号

产品形象

  • intID
  • int产品编号
  • sbyte?命令

关系

  • Product.ID FKProductImage.ProductID (一对多)
  • Product.ID FKProductColorOption.ProductID (一对多)
  • Product.ID FKProductModel.ProductID (一对多)
  • ProductColor.ID FKProductColorOption.ProductColorID (一对多)

谢谢大家!


更新

下面高斯汀的建议解决了问题(不再例外),但并没有真正针对实际问题。出于这个原因,我将把这个问题“悬而未决”。

更新 2

我现在意识到该错误与实体框架无关,而是与 MySQL 数据提供程序有关。出于某种原因,它将 ProductColor.ID 视为 byte[],然后尝试将其盲目地转换为 int。这根本不是实体框架问题。诅咒你Sun Microsystems ORACLE。

4

1 回答 1

2

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

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

// ... and so on

这可能是有益的。

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

于 2009-09-09T18:41:18.820 回答