私はしばらくこれに取り組んできましたが、まだ解決策が見つかりませんでした。私はここ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 の有無にかかわらず試してみました。
コンテキストへの呼び出しにレイアウト テーブルを含めると、グループのみを取得する限り機能します。アイテムも取得すると、例外がスローされます (明らかに、アイテムとレイアウトの間の関係を作成できます)。
したがって、すべてのコンポーネントを取得する場合、コンポーネントがグループの場合は、コンテキストをもう一度呼び出して、その正確なグループ オブジェクトを取得する必要があり、それがレイアウトと共に表示されます。しかし、この方法は非常に非効率的であると考えています。さらに、すべての階層を表示するビューでもそうするつもりはありません。
私が考える限り、エンティティをコンポーネントとして取得していて、コンポーネントにはレイアウトがないため、一部のコンポーネントが実際にレイアウト付きのグループであっても、レイアウトはグループにロードされていません。
私の質問は、コンポーネント階層のようなすべての階層を取得する方法です。現在の要素がグループである場合、コンポーネントをグループにキャストした後、手動で取得する代わりにレイアウトにアクセスできます。データベースから。
私の問題についてさらに情報が必要な場合は、質問してください。よろしくお願いします。