1

以下を参照してください。これらは、データベースにアクセスするために使用する POCO クラスです。コード ファースト アプローチを使用し、ApplicationEntityConfiguration を使用して、エンティティと DB テーブル間のすべてのマッピングを明示的に構成します。

 public class Group
{
    public string Code { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}

public class Item
{
    public string Code { get; set; }
    public string Name { get; set; }
    public virtual Group ParentGroup { get; set; }
}

グループとチャイルドの間の関係は明示的ではありません。外部キーはありません。論理的な関係はコードによって定義されます。グループには、親グループと同じコードで始まるコードを持つすべてのアイテムが含まれている必要があります

Context.Items.Where(x => x.Code.StartsWith(parentGroup.Code));

各グループのすべての子を持つデータベース内のすべてのグループのコレクションを呼び出し元メソッドに返す必要があります。データをリクエストするときは、Context.Groups をリクエストし、グループごとに Where を使用して Items をリクエストできます。データベースに 50 を超えるグループと 1000 を超えるアイテムがあるため、このような手動のアプローチでは、データベースに対して 50 を超えるクエリが発生し、パフォーマンスに影響を与えます。

より最適な解決策は、1 つのコレクション内のすべてのグループを要求し、次に別のコレクション内のすべてのアイテムを要求し、それらすべてのデータがメモリ内にあるときに、各グループのアイテムのコレクションを埋めることです...その後、DB にあまりヒットしません。

したがって、一般的に目標を達成することはできますが、グループとアイテム間の関係が .Where(x => x.Code.StartsWith (parentGroup.Code)) が宣言されると、開発者は、グループとアイテムを一緒にロードしたい場合に Include() を使用したり、アクセス時に子アイテムをロードできる遅延ロードに依存したりできます。

4

1 に答える 1

1

これを行うには、2 番目のアプローチよりも良い方法はありません。これは、Entity Framework が、親の PK との外部キー関係を持つコレクションのみを読み込むことができるためです。一意のインデックスへの関連付けはまだサポートされていません。

同様に、参照しているリレーションシップの修正プロセスは、関連付けがマップされている場合にのみ機能します。しかし、あなたの場合はマップできないため、EF はコレクション自体を設定できません。

于 2013-07-15T09:43:46.073 に答える