1. ホーム
  2. c#

[解決済み] 新しいDbContext()を作成するタイミングは?

2023-06-06 04:03:21

質問

現在、私は DbContext を使用しています。

namespace Models
{
    public class ContextDB: DbContext
    {
              
        public DbSet<User> Users { get; set; }
        public DbSet<UserRole> UserRoles { get; set; }

        public ContextDB()
        {
            
        }
    }
}

の先頭で次のような行を使用しています。 ALL の先頭に使用しています。また、ユーザーに関するすべてのメソッド(アクティブユーザーの取得、ロールの確認など)を含むUserRepositoryクラスでもこの行を使用しています。

ContextDB _db = new ContextDB();

これを考えると、例えばUserRepositoryを使用するコントローラを訪問する場合など、一人の訪問者が複数のDbContextをアクティブにできる場合があり、これは最善のアイデアではないかもしれません。

いつ新しいDbContextを作るべきでしょうか?あるいは、1 つのグローバルなコンテキストを持ち、それがすべての場所で受け渡され、再利用されるべきでしょうか。その場合、パフォーマンスに影響が出るでしょうか。これを行うための代替方法の提案も歓迎します。

どのように解決するのですか?

ベースコントローラを使用しています。 DataBase プロパティを公開しており、派生コントローラはそれにアクセスすることができます。

public abstract class BaseController : Controller
{
    public BaseController()
    {
        Database = new DatabaseContext();
    }

    protected DatabaseContext Database { get; set; }

    protected override void Dispose(bool disposing)
    {
        Database.Dispose();
        base.Dispose(disposing);
    }
}

私のアプリケーションのすべてのコントローラは BaseController から派生し、このように使用されます。

public class UserController : BaseController
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(Database.Users.OrderBy(p => p.Name).ToList());
    }
}

では、質問にお答えします。

<ブロッククオート

いつ新しいDbContextを作るべきですか? を渡すべきでしょうか?

コンテキストはリクエストごとに作成する必要があります。コンテキストを作成し、それを使って必要なことを行い、そしてそれを取り除く。私が使っている基底クラスのソリューションでは、コンテキストの使用についてだけ心配すればよいのです。

グローバルなコンテキストを持とうとしないでください(これはウェブアプリケーションがどのように動作するかではありません)。

すべての場所で再利用するグローバルなコンテキストを1つ持つことができますか?

いいえ。もしコンテキストを保持し続けると、すべての更新、追加、削除などを追跡することになり、アプリケーションの速度が低下し、アプリケーションにかなり微妙なバグを発生させる可能性もあります。

おそらく、リポジトリを公開することを選択すべきです。 または のどちらかを選択すべきですが、両方は選択しないでください。同じメソッドからアクセスできる2つのコンテキストを持つことは、アプリケーションの現在の状態について異なる考えを持っている場合、バグにつながるでしょう。

個人的には DbContext の薄いラッパーで終わってしまうので、直接公開することを好みます。 DbContext の薄いラッパーにすぎないからです。

これはパフォーマンスヒットを引き起こしますか?

DbContext が最初に作成されるときはかなり時間がかかりますが、一度作成されると多くの情報がキャッシュされるため、その後のインスタンス作成はかなり速くなります。データベースへのアクセスが必要になるたびにインスタンス化するよりも、コンテキストを保持する方がパフォーマンスの問題に直面する可能性が高くなります。

他の皆さんはどのようにされているのでしょうか?

場合によるね。

人によっては、依存性注入フレームワークを使用して、コントローラの作成時にコンテキストの具体的なインスタンスを渡すことを好む人もいます。どちらの選択肢も問題ありません。私のは、使用されている特定のデータベースが変更されないことが分かっている小規模なアプリケーションに適しています。

という意見もあるかもしれませんが はできない このことを知らないからこそ、依存性注入法がより良い理由であり、アプリケーションをより変更に強くするのです。これについての私の意見は、おそらくそれは変更されません(SQL server & Entity Frameworkはほとんど不明瞭ではありません)、そして、私の時間は私のアプリケーションに固有のコードを書くことに費やされるのが最善であるということです。