[解決済み] 新しいDbContext()を作成するタイミングは?
質問
現在、私は
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はほとんど不明瞭ではありません)、そして、私の時間は私のアプリケーションに固有のコードを書くことに費やされるのが最善であるということです。
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
-
[解決済み] C# 新しいT()を作成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] 2つのリストを結合する
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】パラメータ付きRedirectToAction