0

私はしばらくこれに取り組んできましたが、まだ解決策が見つかりませんでした。私はここSOで似たようなものを見ませんでした。

まずはEF4.3.1.0とMVC3

Group と Item という 2 つのテーブルを継承するクラス Component があります。また、グループにはコンポーネントのリストを含めることができます (グループまたはアイテムであることがわかっています)。

その時点までは、すべて問題ありません。今問題。別のクラスがあります: レイアウト。グループ (アイテムやコンポーネントではなく、グループのみ) にはレイアウトがあります。

問題は、すべてのコンポーネント階層をロードすると、グループのレイアウト オブジェクトが常に null になることです。

いくつかのコードを入れてみましょう:

public abstract class Component
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    public int OrderNum { get; set; }
    public virtual Group ParentGroup { get; set; }
}

[Table("Group")]
public class Group : Component
{
    public virtual IList<Component> Items { get; set; }
    public virtual Layout Layout { get; set; }

    public Group()
    {
        this.Items = new List<Component>();
        Layout = new Layout();
    }
}

public class Layout
{
    public int Id { get; set; }
    public string Data { get; set; }
}

Lazyloading の有無にかかわらず試してみました。

コンテキストへの呼び出しにレイアウト テーブルを含めると、グループのみを取得する限り機能します。アイテムも取得すると、例外がスローされます (明らかに、アイテムとレイアウトの間の関係を作成できます)。

したがって、すべてのコンポーネントを取得する場合、コンポーネントがグループの場合は、コンテキストをもう一度呼び出して、その正確なグループ オブジェクトを取得する必要があり、それがレイアウトと共に表示されます。しかし、この方法は非常に非効率的であると考えています。さらに、すべての階層を表示するビューでもそうするつもりはありません。

私が考える限り、エンティティをコンポーネントとして取得していて、コンポーネントにはレイアウトがないため、一部のコンポーネントが実際にレイアウト付きのグループであっても、レイアウトはグループにロードされていません。

私の質問は、コンポーネント階層のようなすべての階層を取得する方法です。現在の要素がグループである場合、コンポーネントをグループにキャストした後、手動で取得する代わりにレイアウトにアクセスできます。データベースから。

私の問題についてさらに情報が必要な場合は、質問してください。よろしくお願いします。

4

0 に答える 0