我的实体框架上下文遇到了一些困难,这对调试来说非常麻烦。我昨天在我的应用程序中添加了一个功能,它为我的一个实体提供了一个额外的子实体集合(称为模型),并在我查询父对象时将我的一个表达式更新为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?
订单FK
ProductImage.ProductID (一对多) FK
ProductColorOption.ProductID (一对多) FK
ProductModel.ProductID (一对多) FK
ProductColorOption.ProductColorID (一对多) 全部谢谢!
更新
gaustin的建议下面修复了问题(没有更多例外),但并没有真正针对实际问题。出于这个原因,我将留下“未答复”的问题。
更新2
我现在意识到这个bug不是属于实体框架,而是属于MySQL数据提供者。由于某种原因,它将ProductColor.ID视为byte [],然后尝试将其盲目地转换为int。这根本不是实体框架问题。诅咒你 Sun Microsystems ORACLE。
答案 0 :(得分:2)
您是否尝试过延迟加载包含?
var product = DbEntities.Products.FirstOrDefault(p => p.Id == id);
product.Images.Load();
// ... and so on
这可能是提供信息的。
这看起来也是known issue。我不确定目前是否有已知的分辨率。如果有,我找不到它。