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 が混乱しているためですか? OrderState
Linq ステートメントからを削除すると.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 テーブルから単一の型付き要素を取得することです。