1

私のコントローラーには次のコードがあります。

public class MyController : Controller
{
  private readonly IMyRepository myRepository;

  public MyController() : this(new MyRepository())
  {}

  public MyController(IMyRepository myRepository)
  {
    this.myRepository = myRepository;
  }

  public ActionResult Index()
  {
    return View(myRepository.GetData());
  }
}

MyRepositoryは、データ操作にEFを使用します。ユーザーがこのページをロードするたびに、MyRepositoryのインスタンスが作成されます。これは、EFコンテキストが作成され、Fluent APIコードが実行されていることを意味します(OnModelCreatingメソッド)。

ユーザーがページをロードするたびにEFコンテキストを作成しない可能性はありますか?

4

5 に答える 5

7

MyRepositoryは、データ操作にEFを使用します。ユーザーがこのページをロードするたびに、MyRepositoryのインスタンスが作成されます。これは、EFコンテキストが作成され、Fluent APIコードが実行されていることを意味します(OnModelCreatingメソッド)。

あなたが間違っている。OnModelCreatingメソッドにブレークポイントを設定します。このメソッドは、アプリケーションのロード時に1回だけヒットします。プロジェクトを再構築すると、バイナリdllがアプリドメインに再ロードされるため、ブレークポイントに再びヒットします。ただし、アプリケーションを実行したままにして、コントローラーアクションを2回(間に再構築せずに)OnModelCreatingヒットした場合、2回目はヒットしないことがわかります。Serg Rogovtsevが言うように、EFは、OnModelCreating中に作成された後、モデル(スキーマを意味する)をキャッシュします。

Serg Rogovtsevの答えに対して私がしなければならない唯一の異議は、DbContextのシングルトンインスタンスを決して作成しないということです。代わりに、HttpContextごとに(別名Webリクエストごとに)1つのインスタンスを使用する必要があります。これをシングルトンとして使用し、同時実行を有効にしている場合、アプリでDbConcurrencyExceptionsが忍び寄るのを目にすることになります。DI / IoCを使用し、要求応答サイクルの開始/終了時にDbContextインスタンスを作成/破棄します。これがベストプラクティスです。new MyDbContext()インスタンス作成のオーバーヘッドについて心配する必要はありません。最初の建設中にEFが初期化(ウォームアップ)した後、将来の建設はかなり安くなります。

于 2012-07-24T20:29:37.957 に答える
2

質問に答えるには、リポジトリのシングルトンを作成するか、単一のインスタンスを保持するDIコンテナを使用できます。

ただし、要点は、内部にブレークポイントを設定OnModelCreatingすると、アプリケーションインスタンスごとに1回だけ呼び出されることがわかります。EntityFrameworkは、非常に効果的なモデルキャッシングを使用します。したがって、EFコンテキストの作成によって引き起こされるパフォーマンスの低下について心配する必要はありません。

于 2012-07-24T18:18:41.527 に答える
0

コントローラを変更して、リポジトリのインスタンスを怠惰な方法で作成します。たとえば、 Lazy<T>クラスを使用できます。

于 2012-07-24T18:14:31.063 に答える
0

パフォーマンスの観点から、コンテキストではなくデータを永続化することをお勧めします。EFコンテキストは、プール内の接続を解放するために作成され、破棄されるように最適化されています。http://www.sql-server-performance.com/2012/entity-framework-performance-optimization/にある他のいくつかのEFパフォーマンスメソッド

于 2012-07-24T18:21:39.530 に答える
0

ベストプラクティスは、データを取得/更新した後にEFコンテキストを破棄することです。

于 2012-07-24T18:26:11.213 に答える