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 つの異なる方法で機能しているだけです。ProductPlatformEntityCollectionProductGroupFixUpCollectionPlatform.Products_productsEntityCollection_platformsFixupCollection
オブジェクトのEntities遅延読み込みとプロキシ作成が有効になっています。Product、PlatformおよびCoreProductオブジェクトはすべて、Entity.DynamicProxies名前空間内の動的 EF プロキシです。と を熱心にロードしようとしましPlatformたProductGroupが、違いはありませんでした。モデル ビューアーでのクラスの設定方法に違いは見られません。
ProductGroupコレクションの 1 つに何千ものオブジェクトが含まれており、そのコレクションにクエリを実行したいので、これは頭痛の種です。私の知る限り (間違っている場合は訂正してください)、FixUpCollectionすべてのオブジェクトをメモリにロードせずにa をクエリすることはできませEntityCollectionんCreateSourceQuery()。誰もこの動作を見たことがありますか? どこかに欠けている設定はありますか?ポインタやヘルプをいただければ幸いです。