0

POCO Entity Framework アプリケーションで作成している Linq To Entities クエリがあります。これは次のようになります。

var orders = stateRepository.Get()
                           .OfType<OrderedState>()
                           .Where(x => x.Id == stateId)
                           .Include(x => x.Order);
return orders.FirstOrDefault();

これOfTypeは、State エンティティが Table Per Hierarchy 継承を使用するためです。OrderedStateとその子のみがOrderプロパティを使用できます。

ただし、実行すると、次のエラーが発生します。

タイプ 'System.Data.Entity.DynamicProxies.OrderedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F' のオブジェクトは、タイプ My.NameSpace.Entities.OrderedState' のオブジェクトを含む EntityCollection に追加、アタッチ、または削除できません。

これは、私が興味を持っている共通のプロパティをOrderedState継承して共有するという事実によって、EntityFramework が混乱しているためですか? OrderStateLinq ステートメントからを削除すると.Include(x => x.Order)、エラーは回避されますが、この State に関連する Order 自体は、その値を正確に取得することが目的の場合に null として返されます。

編集: より多くの調査により、さらに奇妙なことが起こっていることに気付きました。私の TPH 継承階層は次のようになります。

BasicState
  has many -> StatefulEntities
  has a -> CreationDate

LocationState : BaseState
   has a -> EntityLocation

ReceivedState : LocationState
   has a -> ReceivedDate

ApprovedState : LocationState
  has a -> ApprovedBy

OrderedState 
  has a -> Order

DispatchedState : OrderedState
  has a -> DispatchNumber

したがって、シークするOrderedStateと、OrderedState または A DispatchedState のいずれかになりますが、私が興味を持っているのはOrderプロパティの読み込みです。これは、BaseState オブジェクトの型指定されていないリストがある場合は実行できません。

私が今気付いているのは、.Include( x => x.Order) Entity Framework が型引数を無視する場合です。シード データを微調整し、このタイプのエラー メッセージが表示され始めたので、これはより明確になりました。

タイプ 'System.Data.Entity.DynamicProxies.ReceivedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F' のオブジェクトは、タイプ My.NameSpace.Entities.OrderedState のオブジェクトを含む EntityCollection に追加、添付、または削除できません。

私はこれに驚いたので、型を強化しようと思いました:

var orders = stateRepository.Get()
                           .OfType<OrderedState>()
                           .Where(x => x is OrderedState && x.Id == stateId )
                           .Include(x => x.Order);

案の定、Orderプロパティを含めようとしないと、OrderedStates のみが返されます。Include意図的に返さないようにしようとしている型を返すことができないため、使用するとすぐに例外が発生します。私が照会している Id は間違いなく OrderedState の ID です。実際、私が呼び出しているメソッドは、この問題を防ぐかどうかを確認するためのテストとして、まだ OrderedState オブジェクトのみを受け入れます。

私の目標は、この型付き要素のみが持つ子プロパティを含む、TPH テーブルから単一の型付き要素を取得することです。

4

0 に答える 0