web-dev-qa-db-ja.com

Entity Framework 4でデフォルトで遅延読み込みを無効にする

EF4では、遅延読み込みがデフォルトで有効になっているようです。少なくとも、私のプロジェクトでは、

dataContext.ContextOptions.LazyLoadingEnabled

デフォルトではtrueです。遅延読み込みはしたくないし、書く必要もありません。

dataContext.ContextOptions.LazyLoadingEnabled = false;

新しいコンテキストを取得するたびに。では、たとえばプロジェクト全体でデフォルトでオフにする方法はありますか?

60

次の答えは、Database-FirstまたはModel-Firstワークフロー(質問が行われたときにEntity Framework(バージョン<= 4.0)で使用できた2つのワークフローのみ)。 Code-Firstワークフロー(EFバージョン> = 4.1以降で使用可能)を使用している場合、ssmithの answer に進みます正しい解決策の質問。


Edmxファイルの<ConceptualModel>および<EntityContainer>定義には、一般にfalseに遅延読み込みを設定できる遅延読み込みの属性があります。

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">

これにより、ObjectContextコンストラクターに次の設定が作成されます。

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
    this.ContextOptions.LazyLoadingEnabled = false;
    OnContextCreated();
}

私の例は、生成されたObjectContext(または新しいEFバージョンのDbContext)を手動で編集することを意味するものではありません(ctorxが指摘したように、データベースからのすべてのモデル更新で上書きされます) )ただし、EDMXファイルのedmx:ConceptualModelsセクションのEntityContainer要素は、annotation:LazyLoadingEnabled="false"属性を追加して編集する必要があります-XMLエディターまたはデザイナーのプロパティページで手動でこのオプションも利用可能な場所で、EDMXを右クリックしてから[プロパティ]を選択します。

enter image description here

このEDMXファイルの変更により、上記のようなコンストラクターで無効な遅延読み込みオプションを使用してコンテキストクラスが自動的に生成されます。モデルがデータベースから更新されても、EDMXファイルの変更自体は上書きされません。

67
Slauma

新しい遅延読み込み機能がEF Code Firstでどのように機能するか を示す簡単なサンプルを作成しました。 Code Firstモデルで必要なものを実現するには、次のようにDbContextのコンストラクターに1行追加するだけです。

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}
61
ssmith

EF4 Code Firstを使用している場合は、そうですか?したがって、コンテキストの初期化では、「OnModelCreated」のオーバーライドがあります。

このメソッドでは、プロパティを呼び出して設定するだけで、すべて解決しました。

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     base.Configuration.LazyLoadingEnabled = false;
}

私のモデルは今でははるかに美味です。遅延読み込みは素晴らしいです...しかし、あなたがそれを望まないときはそうではありません。そして、循環参照を持つようになると、それはばかげている。

24
beauXjames

デザイナーからもできます。 .edmxファイルを開き、モデル上の任意の場所を右クリックして、[プロパティ]を選択します。次に、LazyLoadingEnabledをfalseに設定します。 enter image description here

23
Amin Saqi

コードファーストをモデル化する場合は、参照/オブジェクトプロパティのvirtualキーワードを削除するだけです。参照に仮想を設定すると、その特定の参照でLazyLoadingが有効になります。

4
Todd