DUICUO

Entity Framework の DbContext の使い方

[[380644]]

この記事は、WeChat公式アカウント「Code Farmer Reading」から転載したものです。執筆者はCode Farmer Readingです。転載の許可については、Code Farmer Reading公式アカウントまでお問い合わせください。

Microsoft の Entity Framework は、オープンソースのオブジェクトリレーショナルマッピング (ORM) フレームワークであり、データベースのデータモデルとドメインモデル間のギャップをコードレベルで埋めるのに役立ちます。Entity Framework は、アプリケーションによるデータベースの CRUD 操作を簡素化し、データベースへのデータの永続化方法を上位レベルで保護します。

より具体的には、DbContext はデータベースとドメインモデル間のブリッジとして機能します。この記事では、DbContext を設定し、Entity Framework Core プロバイダーを使用してデータベースに対して CRUD 操作を実行する方法について説明します。

Dbコンテキスト

DbContext は Entity Framework の非常に重要なコンポーネントです。データベースへのセッション接続として機能します。エンティティコレクションへのデータのクエリや、基盤となるデータベースへのエンティティの保存に使用できます。Entity Framework Core の DbContext には、以下の機能モジュールがあります。

  • 接続管理
  • クエリデータ
  • 永続データ
  • 変更追跡
  • キャッシュ
  • トランザクション管理

EntityFrameworkを使用するには、NuGet経由でMicrosoft.EntityFrameworkCoreパッケージを参照する必要があります。Visual Studio 2019のNuGetパッケージマネージャービジュアルインターフェースからインストールするか、NuGetパッケージマネージャーのコマンドラインツールで以下のコマンドを入力してインストールできます。

  1. dotnetパッケージ Microsoft.EntityFrameworkCoreを追加します

次に、ASP.NET Core で DbContext を使用する方法について説明します。

DbContext を作成する

まず、次のコードに示すように、Entity Framework の基本クラス DbContext から継承する CustomContext クラスを作成します。

  1. パブリッククラス CustomContext: DbContext
  2. {
  3. パブリックCustomContext(DbContextOptions オプション) : ベース(オプション)
  4. {
  5. }
  6.  
  7. 保護されたオーバーライド void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  8. {
  9. //コンテキストを設定するためのコードをここに記述します
  10. }
  11.  
  12. 保護されたオーバーライド void OnModelCreating(ModelBuilder modelBuilder)
  13. {
  14. //ここにモデルを構成するコードを記述します
  15. }
  16. }

ご覧のとおり、CustomContextのコンストラクタはDbContextOptions型のパラメータを受け取ります。このクラスは主に、DbContextに必要なパラメータを設定するために使用されます。もちろん、OnConfiguring()メソッドでDbContextを設定することもできます。以下のOnModelCreating()メソッドは、モデルの設定に使用されます。

以下では、CustomContext にいくつかの DbSet を追加します。次のコードに示すように、属性はエンティティ コレクションを表すために使用されます。

  1. パブリッククラス CustomContext: DbContext
  2. {
  3. パブリックCustomContext(DbContextOptions オプション) : ベース(オプション)
  4. {
  5. }
  6.  
  7. 保護されたオーバーライド void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  8. {
  9. }
  10.  
  11. 保護されたオーバーライド void OnModelCreating(ModelBuilder modelBuilder)
  12. {
  13. }
  14.  
  15. パブリックDbSet<Author> 著者 { 取得;設定; }
  16.  
  17. public DbSet<Blog> ブログ { 取得;設定; }
  18. }
  19.  
  20. パブリッククラス Author
  21. {
  22. 公共  int AuthorID { 取得;設定; }
  23.  
  24. パブリック文字列 AuthorName { 取得;設定; }
  25. }
  26.  
  27. パブリッククラスのブログ
  28. {
  29. 公共  intブログID { 取得;設定; }
  30.  
  31. パブリック文字列 BlogName { 取得;設定; }
  32.  
  33. 公共  int AuthorID { 取得;設定; }
  34. }

DbContext を登録し、ASP.NET Core ランタイムに挿入します。

ASP.NET Core で使用するには、CustomerContext を ServiceCollection コンテナに挿入する必要があります。ここでは SQL Server を基盤ストレージとして使用しているため、NuGet の Microsoft.EntityFrameworkCore.SqlServer パッケージも参照する必要があります。次に、Startup.ConfigureServices() に次のコードを追加します。

  1. パブリッククラス Startup
  2. {
  3. // このメソッドはランタイムによって呼び出されます。このメソッド使用して コンテナサービスを追加します
  4. パブリックvoid ConfigureServices(IServiceCollection サービス)
  5. {
  6. services.AddControllersWithViews();
  7.  
  8. services.AddDbContext<CustomContext>(options => options.UseSqlServer( "データ ソース=.; 初期カタログ=MyTest; Trusted_Connection=Yes" ));
  9. }
  10. }

DbContext 依存性注入

CustomContext がコンテナに注入されたので、HomeController 内の CustomerContext インスタンスを依存性注入によって取得できます。以下のコードスニペットは、その方法を示しています。

  1. パブリッククラス HomeController: コントローラー
  2. {
  3. ILogger<HomeController> ロガー;
  4. プライベート CustomContext dbContext;
  5.  
  6. パブリックHomeController(ILogger<HomeController> ロガー、CustomContext dbContext)
  7. {
  8. this.logger = ロガー;
  9. this.dbContext = dbContext;
  10.  
  11. dbContext.データベース.EnsureCreated();
  12. }
  13. }

上記のコードでは、データベースが正常に作成されたことを確認するために `dbContext.Database.EnsureCreated();` を使用しました。このコードを実行すると、下の画像に示すように、`MyTest` という名前のデータベースと `Author` および `Blog` という名前の2つのテーブルが生成されます。

次に、Indexメソッドにレコードを挿入し、クエリを実行します。結果は以下のようになります。

EFの設定はこれで完了です。これでCRUD操作にCustomContextを使用できるようになります。DbContextは概念的にはObjectContextに似ており、UnitOfWorkユニットを表します。EFはDDDの実装例です。DbContextはアプリケーションとデータベース間のやり取りを担います。Entity Framework Coreのその他の機能については、今後の記事で詳しく紹介します。

翻訳リンク: https://www.infoworld.com/article/3311737/how-to-use-the-dbcontext-in-entity-framework-core.html