0

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)を削除した場合、またはコレクションが空の場合、例外はスローされません。ColorsColors

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)

エンティティ定義(関連フィールドのみ)

製品

  • intID
  • EntityCollection<ProductColorOption>
  • EntityCollection<ProductImage>画像
  • EntityCollection<ProductModel>モデル

ProductColor

  • intID

ProductColorOption

  • intID
  • int製品番号
  • intProductColorID

製品モデル

  • intID
  • int製品番号

ProductImage

  • intID
  • int製品番号
  • sbyte?注文

関係

  • Product.ID FKProductImage.ProductID (1対多)
  • Product.ID FKProductColorOption.ProductID (1対多)
  • Product.ID FKProductModel.ProductID (1対多)
  • ProductColor.ID FKProductColorOption.ProductColorID (1対多)

皆さんありがとう!


アップデート

以下のgaustinの提案は問題を修正しますが(これ以上の例外はありません)、実際の問題を対象としているわけではありません。そのため、「未回答」という質問は残しておきます。

アップデート2

バグはEntityFrameworkではなく、MySQLDataProviderに関係していることがわかりました。何らかの理由で、ProductColor.IDをbyte []として扱い、それを盲目的にintにキャストしようとしています。これは、EntityFrameworkの問題ではありません。サンマイクロシステムズのオラクルを呪う。

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 に答える