4

POCO T4 テンプレートによって作成された Entity Framework POCO で奇妙な問題に遭遇しました。一部のオブジェクトではコレクション プロパティが として作成され、EntityCollection他のオブジェクトでは として作成されますFixUpCollection

製品階層をモデル化する 3 つのクラスでこれを見つけています。ProductGroupPlatformおよび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遅延読み込みとプロキシ作成が有効になっています。ProductPlatformおよびCoreProductオブジェクトはすべて、Entity.DynamicProxies名前空間内の動的 EF プロキシです。と を熱心にロードしようとしましPlatformProductGroupが、違いはありませんでした。モデル ビューアーでのクラスの設定方法に違いは見られません。

ProductGroupコレクションの 1 つに何千ものオブジェクトが含まれており、そのコレクションにクエリを実行したいので、これは頭痛の種です。私の知る限り (間違っている場合は訂正してください)、FixUpCollectionすべてのオブジェクトをメモリにロードせずにa をクエリすることはできませEntityCollectionCreateSourceQuery()。誰もこの動作を見たことがありますか? どこかに欠けている設定はありますか?ポインタやヘルプをいただければ幸いです。

4

1 に答える 1

1

すべてのオブジェクトをメモリに読み込まずに FixUpCollection をクエリすることはできませんが、これは EntityCollection の場合には当てはまりません。

クエリに関してFixUpCollectionとの間に違いはありません。遅延読み込みのために動的プロキシによって使用されます。このタイプのプロパティでクエリを実行しようとすると、遅延読み込みは引き続きすべてのレコードを読み込み、クエリは Linq-to-object として実行されます。EntityCollectionEntityCollection

あなたの問題は、おそらく遅延ロードプロキシを作成するためのいくつかのルールに違反することに関連しています。

于 2012-05-30T12:10:41.613 に答える