在我的实体框架上下文中,我遇到了一些困难,这使得调试非常麻烦。我昨天向我的应用程序添加了一个特性,它为我的一个实体提供了一个附加的子实体集合(称为模型),在更新了我的表达式之一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
产品目录
-
sbyte?
秩序
关系
-
产品ID
FK
产品图像.productID
(一对多)
-
产品ID
FK
产品颜色选项.productID
(一对多)
-
产品ID
FK
产品型号.productID
(一对多)
-
产品颜色.id
FK
产品颜色选项。产品颜色
(一对多)
谢谢大家!
更新
下面的Gaustin建议解决了问题(不再例外),但并没有真正针对实际问题。因为这个原因,我要留下这个问题“未回答”。
更新2
我现在意识到这个bug不属于实体框架,而是属于MySQL数据提供者。出于某种原因,它将productcolor.id视为byte[],然后试图将其盲目强制转换为int。这根本不是实体框架问题。诅咒你
太阳微系统
神谕。