1

興味深い問題があります。たとえば、「Container」というタイプのメンバーを持つ「Container」というクラスを作成しました。次のようになります。

public class Container { public Contained cnt{ get; set; } }

モデルには両方のテーブルが含まれており、私のDBは次のようになります。Containers(PK:id FK:Contained_ContainedId)Contained(PK:ContainedId)

EFコードは、最初にこの属性をContinedテーブルの外部キーとして正しくマップします。問題は、LINQを使用してこれらのオブジェクトを取得するときに発生します。

Container Con=(from Object in PersistentManager.Containers.OfType<Container> select Object).SingleOrDefault();

このように(または匿名タイプをキャストして)、コンテナーを取得します。問題は、Containedオブジェクトへの参照が常にnullであるということです。これはパフォーマンスのために意図的に作成されたものだと思いますが、今回はオブジェクト全体を復元するために必要です。Intellitraceは、テーブルを結合していないことを示しているので、他に何かを指定する必要があると思います。何かアイデアはありますか?

Allrigth、Basicのおかげで、include句を使用して問題を解決しました。コンテキストが閉じた環境で遅延読み込みを使用する方法があるべきだと思います(多層パターンは常にこれらのオブジェクトを破棄することをお勧めします)

4

1 に答える 1

1

Ok...

Include関連するテーブルが必要です。例えば

(from PersistentManager.Containers.Include("Contained").OfType...

毎回複数のテーブルを含めることができます

(from PersistentManager.Containers.Include("Contained").
Include("OtherContained").
Include("Contained.SomeOtherLinkedType").
OfType...

などなど

n層での遅延読み込みは、データの処理方法によって異なります。私は個人的に、DAL / BLで遅延読み込みを有効にすることを好みますが、非EF DTO(実質的にエンティティと同一ですがマップされていません)をUIに渡します。このようにして、BLは必要なデータを簡単に取得でき、UIは「不活性」オブジェクトを取得します。

于 2012-10-21T17:20:21.933 に答える