2012-03-17 5 views
0

EFコードを最初に選択するか、モデルを最初に選択する必要があります。コードファーストとデータロード

私は、開発効率とIoCフレームワーク統合のための最も簡単なソリューションのための最良のソリューションは何か分かりません。

私は最初にコードから始めようとしましたが、ナビゲーションプロパティをIQueryableとして使用することができませんでした。私は、ナビゲーションプロパティを宣言するとき、私は次のようにいるICollectionを使用します。

public class Invoice { 
... 
    public ICollection<LineItem> LineItems { get; set; } 
... 
} 

public class LineItem { 
... 
    public Invoice Invoice { get; set; } 
... 
} 

私は請求書をロードすると、私のLineItemsコレクションがあるため遅延ロードの空です。

ただし、このコレクションをIQueryableとして使用するには、このプロパティをデータベースから読み込むと、このInvoiceのすべてのLineItemがデータベースからロードされますか?

私の考えは、IQueryableを使用してパフォーマンスを向上させるために、できるだけデータベースの読み込みを少なくすることです。

私は間違っていますか?ベストプラクティスは何ですか?

私はデータベースを最初に使用するときに、プロキシクラスやラッパーを記述しなくても、すぐにIQueryableとしてナビゲーションプロパティを使用できます。

ありがとうございました

+0

「マイナビゲーションプロパティをIQueryableとして」 - これは必ずしもプラスではありません。 –

+0

なぜですか?自分のコレクションプロパティにクエリを適用してデータベースが乱れる前にSQLクエリを作成することができます – xwrs

+0

lazyloadingのように見えます。実際にレコード/エンティティにアクセスするまで、実際のクエリをデータベースに遅らせます。しかし、場合によっては、eagerloadingやlazyloading/proxyをオフにする必要がありますが、それは別の話です。 –

答えて

0

すべてのエンティティプロパティを仮想にする必要があります。これにより、EFはエンティティのプロキシクラスを生成することができます。

public class Invoice { 
    public virtual ICollection<LineItem> LineItems { get; set; } 
} 
+0

私はこの遅延を有効にしました.Configuration.LazyLoadingEnabled = true;私のナビを設定します。仮想としてのプロパティ。しかし、ナビゲーションプロパティの読み込みには影響しません。請求書LineItemsに請求書がロードされています。それらはデフォルトではnullではありません。 – xwrs

+0

EF 4.1ではデフォルトでLazyloadingがオンになっています。 LineItemsが 'virtual'を持っていれば、問題の別の場所を見る必要があると思います。このhttp://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx、およびこのhttp://stackoverflow.com/questions/7619227/entity-framework-code-first-relationships-and-navigation-propertyはあなたにアイデアを与えるはずです。 –

0

あなたは遅延読み込みが動作するためにVirtualキーワードが必要

関連する問題