Entity Frameworkコンテキストで問題が発生しているため、デバッグが非常に面倒です。昨日、アプリケーションに機能を追加して、エンティティの1つに子エンティティの追加コレクション(Modelsと呼ばれる)を追加しました。親オブジェクトをクエリするときに、そのコレクションをInclude()に式の1つを更新した後、クエリが失敗します。以前は正常に機能していたコレクションの別の1つがInclude()された場合の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()のいずれかを削除しても例外はありませんが、これらの3つの子では、コレクションに1つ以上のエンティティを持つ単一のProductをプルしようとするたびに1つあります。FirstOrDefault(p => p.ID == id)を削除した場合、またはコレクションが空の場合、例外はスローされません。Colors
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
IDEntityCollection<ProductColorOption>
色EntityCollection<ProductImage>
画像EntityCollection<ProductModel>
モデル
ProductColor
int
ID
ProductColorOption
int
IDint
製品番号int
ProductColorID
製品モデル
int
IDint
製品番号
ProductImage
int
IDint
製品番号sbyte?
注文
関係
- Product.ID
FK
ProductImage.ProductID (1対多) - Product.ID
FK
ProductColorOption.ProductID (1対多) - Product.ID
FK
ProductModel.ProductID (1対多) - ProductColor.ID
FK
ProductColorOption.ProductColorID (1対多)
皆さんありがとう!
アップデート
以下のgaustinの提案は問題を修正しますが(これ以上の例外はありません)、実際の問題を対象としているわけではありません。そのため、「未回答」という質問は残しておきます。
アップデート2
バグはEntityFrameworkではなく、MySQLDataProviderに関係していることがわかりました。何らかの理由で、ProductColor.IDをbyte []として扱い、それを盲目的にintにキャストしようとしています。これは、EntityFrameworkの問題ではありません。サンマイクロシステムズのオラクルを呪う。