POCO T4 テンプレートによって作成された Entity Framework POCO で奇妙な問題に遭遇しました。一部のオブジェクトではコレクション プロパティが として作成され、EntityCollection
他のオブジェクトでは として作成されますFixUpCollection
。
製品階層をモデル化する 3 つのクラスでこれを見つけています。ProductGroup
、Platform
およびProduct
。それぞれProductGroup
に のコレクションがありPlatform
、それぞれPlatform
に のコレクションがありProduct
ます。すべての関係は双方向です。コレクションの getter と setter は、T4 テンプレートによって生成されるため、各クラスでまったく同じです。したがって、それらはすべて (たとえば) 次のようになります。
public virtual ICollection<Platform> Platforms
{
get
{
if (_platforms == null)
{
var newCollection = new FixupCollection<Platform>();
newCollection.CollectionChanged += FixupPlatforms;
_platforms = newCollection;
}
return _platforms;
}
set { ... }
}
面白いことに、とのすべてのコレクションはsとして作成され、のすべてのコレクションはsieとして作成されます (例: コードが最初に (eg) のゲッターに入ったとき) 。フィールドには既に が入力されていますが、最初に上記の getterは null で、 aが作成され、その後データが取り込まれます。遅延読み込みはどちらの場合でも機能しますが、2 つの異なる方法で機能しているだけです。Product
Platform
EntityCollection
ProductGroup
FixUpCollection
Platform.Products
_products
EntityCollection
_platforms
FixupCollection
オブジェクトのEntities
遅延読み込みとプロキシ作成が有効になっています。Product
、Platform
およびCoreProduct
オブジェクトはすべて、Entity.DynamicProxies
名前空間内の動的 EF プロキシです。と を熱心にロードしようとしましPlatform
たProductGroup
が、違いはありませんでした。モデル ビューアーでのクラスの設定方法に違いは見られません。
ProductGroup
コレクションの 1 つに何千ものオブジェクトが含まれており、そのコレクションにクエリを実行したいので、これは頭痛の種です。私の知る限り (間違っている場合は訂正してください)、FixUpCollection
すべてのオブジェクトをメモリにロードせずにa をクエリすることはできませEntityCollection
んCreateSourceQuery()
。誰もこの動作を見たことがありますか? どこかに欠けている設定はありますか?ポインタやヘルプをいただければ幸いです。