1

私は現在、Entity Framework を使用して asp.net で Web サイトを作成していますEntity Container

現在、私はこれを行っています(MyDBは私のエンティティフレームワークコンテナです):

public partial class User : System.Web.UI.MasterPage
{
     private myDb ctx;
      protected void Page_Load(object sender, EventArgs e)
     {
         if (!IsPostBack) ctx = new myDb();
     }
}

そして、多くの関数でコンテキストを使用します。

しかし、多くのウェブサイトで、私はそれを処理するためにこの方法を見ました:

using (var ctx = new myDb())
{
}

しかし、2番目のものを使用する場合、クラスの多くの関数に配置する必要があります. そして、を再インスタンス化しEntity Containerます。

何が良いですか?なぜそれが優れているのか、また両方が優れている場合、さまざまなケースで一方を他方よりも多く使用しなければならない理由を説明していただけますか.

4

2 に答える 2

2

処分のEntity Container慣習は、次のようなデータベースへのSQL接続などの高価なリソースを処分する習慣から来ています

 using (SqlConnection connection = new SqlConnection(connectionString))
 {}

ただし、Entity Frameworkはクエリが実行されたときにのみ接続を開くほどインテリジェントであるため、Entity Containerは SQL 接続を表していません。したがって、ガベージを少し早く収集することを除けば、この意味での本当の利点はありません。

さらに、コンテキストを破棄する場合は、遅延読み込みを使用できません。で負荷関連データを使用する必要がありますInclude。詳細はこちらEntity Framework - エンティティ オブジェクト コンテキストを破棄した後に参照キーを読み込む

要約すると、リクエストごとに 1 つのコンテキストを使用するアプローチの欠点は見当たりません。対照的に、遅延読み込みがないことは、私にとって重大な欠点です。

于 2013-03-07T09:10:09.160 に答える
1

代わりにコメントを回答として追加したいと思いました。

あなたの場合、あなたはイベントを呼びctx.Dispose();Page_Unload同じ効果を達成することができます

using (var ctx = new myDb()) 
{ 
}

IDisposableを実装するクラスでの作業を使用します。usingブロックが終了すると、.Dispose()メソッドが呼び出されます。そして、オブジェクトを破棄してリソースを解放し、メモリを解放します。サンプルのデータベースオブジェクトはDbContextを継承し、IDisposableを実装しているため、Dispose()が呼び出されると、データベースへの接続も閉じられます。

もちろん、リクエストが多い場合は便利です。データベースへの何千ものオープン接続と大量のメモリが占​​有されることは望ましくありません。

注意すべき点の1つは、Page_Unloadの前に未処理の例外がスローされた場合、unloadイベントは発生せず、データベースオブジェクトは破棄されないことです。

次に、usingを使用することをお勧めします。これは、常に.Dispose()オブジェクトを呼び出すためです。

于 2013-03-07T09:07:52.063 に答える