2017-02-01 5 views
1

私は2つの同様のプロジェクトに取り組んでいますが、どちらも作成していません。Identity.EntityFramework OnModelCreatingとはどのように呼ばれますか

次のようにそれらの両方が、同一のローカルコンテキストを有する:

using Microsoft.AspNet.Identity.EntityFramework; 

    public class LocalContext : 
     IdentityDbContext 
      <ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim> 
    { 
    //..... 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      AddConfigurations(modelBuilder); 
     } 
    } 

は、OnModelCreating戻り、上述した2つのインスタンスを参照するためのプロジェクト全体、プラス名前空間Microsoft.AspNet.Identity.EntityFramework

でこのメソッドへの参照を検索

これらのプロジェクトはOnionアーキテクチャを使用して作成されており、Swaggerを使用してRESTレイヤを実行しています。

問題は、私がアプリケーションを起動するときにプロジェクトのOnModelCreatingが呼び出されるということです(これは私が期待しています)。一方、ユーザがアクションを初めて行うときに呼ばれます。

誰でもこの理由を説明できますか?

私は上記のように、プロジェクト全体を検索したが、このメソッドを呼び出す場所を見つけることができないので、この呼び出しをトリガーする設定があると思うが、見つけられない。

私が見る限り、2つのプロジェクト間ですべての参照が同じであることがわかります。

答えて

2

データベースコンテキストが初期化されたときに呼び出されます。

あなたのスタートアップコードでデータベースの初期化子を使用している場合、それはそれから起こるでしょう:

Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>()); 

をそれ以外の場合、それはあなたがそれのインスタンスを作成して初めて起こるでしょう:

using (var context = new MyDbContext()) { 
    ... 
} 
2

OnModelCreatingメソッドは、派生コンテキストの最初のインスタンスを作成するとき、またはアプリケーションでデータアクセスを使用するときに通常呼び出されます。これがアプリケーションの異なるポイントにある理由は、ライフサイクルのさまざまなポイントでデータアクセスレイヤーを呼び出すことが原因であると考えられます。この場合、1つのアプリケーションが起動時にLocalContextのコピーを作成し、もう1つはユーザーがデータレイヤーにアクセスするまでコンテキストを作成しないと思います。

いくつかの詳細なドキュメントについてはhere、このトピックに触れる別の質問についてはhereをご覧ください。

関連する問題