0

コントローラーで「DBContext」のグローバル変数を宣言し、それをすべてのデータベース操作に使用するのは正しいですか?

例:

public class ProductController : Controller
{
    private readonly DBContextEntities _db = new DBContextEntities();

    public ActionResult Index()
    {
     var products = _db.Products.ToList();
     return View(products);
    }

    public ActionResult Create()
    {
     _db.Products.AddObject(new Product{Name="x",Price="5.2"});
     _db.SaveChanges();
     return View(products);
    }

}

ご意見をお聞かせください、

4

1 に答える 1

1

私はこれを数回秤量しようとしました。ほとんどの状況で問題ないはずだという結論に達しました。これが「理由」であり、大丈夫だと思います。

すべてのアドバイスは、コンテキストを開いたままにする時間をできるだけ短くすることを提案しています。これは、大量のエンティティがロードされてメモリに保持されるのを避けるためです。これにより、クラスでグローバルにコンテキストを作成するのではなく、各メソッドでコンテキストを作成および破棄する必要があると考えるようになります。

HTTP リクエストの期間は短いため、コンテキストをグローバルに利用できるようにすることは大きなオーバーヘッドにはなりません。毎回コンテキストを作成するために必要なリソースは、リクエストの期間中コンテキストを開いたままにしておくことの利点を上回ります。

この回答は Web フォームの観点からのものです。MVC コントローラーがリクエストよりも長く存続し、別のレスポンスが必要な場合、私は 100% ではありません。

重要なのは、コンテキストを静的なもの、またはアプリケーションの期間中存続することを意図したものとして設定しないことだと思います。これにより、メモリ内のエンティティの数が増えるにつれて大量のメモリが消費されるようになります。

IDisposable を実装するものを using ブロック内に明示的に配置しないことは悪い考えであると主張することができますが、これには同意します。

(免責事項: 当て推量の段落!) これは、ページが例外などをチャックした場合に、リソースが開いたままになる可能性について確信が持てないところです。99.9% の確率で問題ないと思いますが、まれにリソースが正しく破棄されない場合があります。

于 2012-05-10T13:05:55.220 に答える