Asp.net-core-dbcontext

提供:Dev Guides
移動先:案内検索

ASP.NET Core-DBContext

Entity Frameworkを使用すると、エンティティと呼ばれる共通言語ランタイム(CLR)オブジェクトを使用して、データのクエリ、挿入、更新、および削除を行うことができます。 Entity Frameworkは、モデルで定義されているエンティティと関係をデータベースにマップします。 また、施設を提供します-

  • データベースから返されたデータをエンティティオブジェクトとして具体化します。
  • オブジェクトに加えられた変更を追跡します。
  • 並行性を処理します。
  • オブジェクトの変更をデータベースに伝播します。
  • オブジェクトをコントロールにバインドします。

オブジェクトとしてのデータとのやり取りを担当する主なクラスはDbContextです。 コンテキストを操作するための推奨される方法は、DbContextから派生し、コンテキスト内の指定されたエンティティのコレクションを表すDbSetプロパティを公開するクラスを定義することです。

DBContext

論理的に、DBContextは、DBContextが理解できるスキーマを持つ特定のデータベースにマップします。 また、そのDBContextクラスでは、DbSet <T>型のプロパティを作成できます。 汎用型パラメーターTは、EmployeeがFirstAppDemoアプリケーションのエンティティであるように、エンティティのタイプになります。

DbContextクラスを作成する簡単な例を見てみましょう。 ここでは、Modelsフォルダーに新しいクラスを追加し、 FirstAppDempDbContext を呼び出す必要があります。 このクラス自体はモデルではありませんが、データベースで使用できるようにすべてのモデルをまとめています。

FirstAppDemoコンテキスト

Miscrosoft.Data.Entity名前空間にあるDbContextクラスからコンテキストクラスを継承します。 次に、そのクラスにEmployeeのDbSetを実装します。

各DbSetはデータベース内のテーブルにマッピングされます。 従業員のプロパティDbSetがあり、そのプロパティの名前がEmployeesである場合、Entity Frameworkはデフォルトでデータベース内のEmployeesテーブルを探します。

using FirstAppDemo.Models;
using Microsoft.Data.Entity;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace OdeToFood.Models {
   public class FirstAppDemoDbContext : DbContext {
      public DbSet<Employee> Employees { get; set; }
   }
}

実装するモデルは1つしかないため、実装は非常に簡単です。 必要なプロパティはEmployeeの DbSet だけで、このプロパティに Employees という名前を付けることができます。

このクラスをコントローラーに直接挿入すると、コントローラーは FirstAppDemoDbContext を使用してデータベースを照会できます。 次のプログラムに示すように、新しいクラスをHomeControllerクラスに追加して、従業員を追加および従業員を取得するメソッドを実装することにより、これらすべてを単純化します。

using Microsoft.AspNet.Mvc;

using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;

using System.Collections.Generic;
using System.Linq;

namespace FirstAppDemo.Controllers {
   public class HomeController : Controller {
      public ViewResult Index() {
         var model = new HomePageViewModel();

         using (var context = new FirstAppDemoDbContext()) {
            SQLEmployeeData sqlData = new SQLEmployeeData(context);
               model.Employees = sqlData.GetAll();
         }
         return View(model);
      }
   }
   public class SQLEmployeeData {
      private FirstAppDemoDbContext _context { get; set; }
      public SQLEmployeeData(FirstAppDemoDbContext context) {
         _context = context;
      }
      public void Add(Employee emp) {
         _context.Add(emp);
         _context.SaveChanges();
      }
      public Employee Get(int ID) {
         return _context.Employees.FirstOrDefault(e => e.Id == ID);
      }
      public IEnumerable<Employee> GetAll() {
         return _context.Employees.ToList<Employee>();
      }
   }
   public class HomePageViewModel {
      public IEnumerable<Employee> Employees { get; set; }
   }
}

上記のSQLEmployeeDataクラスでは、コンテキストに新しい従業員オブジェクトを追加し、変更を保存するAddメソッドを定義したことがわかります。 Getメソッドでは、IDに基づいて従業員を返します。 一方、GetAllメソッドでは、データベース内のすべての従業員のリストを返します。

Entity Framework Servicesの構成

使用可能なEntity Framework DBContextを使用するには、アプリケーションの構成を変更する必要があります。 接続文字列を追加して、DBContextがどのサーバーにアクセスし、どのデータベースを照会するかを知る必要があります。

  • 接続文字列をJSON構成ファイルに入れます。
  • また、StartupクラスのConfigureServicesメソッドの実行中に、さらにいくつかのサービスを追加する必要があります。
  • Entity Frameworkは、ASP.NETやMVCフレームワークと同様に、依存性注入に依存しています。注入が機能するためには、ランタイムはEntity Frameworkが使用するさまざまなサービスについて知る必要があります。
  • 必要なすべてのデフォルトサービスを追加する簡単な構成APIがあります。

AppSettings.jsonファイルに移動して、次のプログラムに示すように接続文字列を追加しましょう。

{
   "message": "Hello, World! this message is from configuration file...",
   "database": {
      "connection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=FirstAppDemo"
   }
}

次に、Entity Frameworkが適切に動作するためにいくつかの追加サービスを追加する必要があるStartupクラスに進みましょう。 具体的には、Entity Frameworkに関連する3つのことが必要です。

  • コアEntity Frameworkサービスを追加する必要があります。
  • SQL Server関連のEntity Frameworkサービスも追加する必要があります。
  • DBContextについてEntity Frameworkに伝える必要があります。

これはすべて、次のプログラムに示すように、 IServiceCollection の拡張メソッドとして使用可能なメソッドを通じて実行できます。

public void ConfigureServices(IServiceCollection services) {
   services.AddMvc();
   services.AddEntityFramework()
      .AddSqlServer()
      .AddDbContext<FirstAppDemoDbContext>

   (option => option.UseSqlServer(Configuration["database:connection"]));
}
  • 最初のメソッドは AddEntityFramework です。 これにより、デフォルトのサービスであるコアEntity Frameworkサービスが追加されます。
  • ただし、Entity Frameworkは非リレーショナルデータベースを含むさまざまな種類のデータベースと連携するように設計されているため、2番目の呼び出しを行って、Entity Frameworkに既定のSQL Server関連サービスを追加するように指示する必要があります。
  • 次に、Entity Frameworkに DBContext クラスについて通知する必要があります。これにより、そのクラスのインスタンスを適切に構築し、3番目のメソッドである AddDbContext メソッドを介して実行できます。
  • これは、DBContext派生クラスである FirstAppDemoDbContext のタイプを指定するジェネリックタイプパラメーターを取ります。
  • AddDbContext内で、DBContextのオプションを記述する必要があります。
  • これは、ラムダ式*によって実行できます。これは、オプションパラメータを受け取るアクションであり、Entity Frameworkはさまざまなデータベースをサポートできます。 必要なことは、この特定のDBContextが *UseSqlServer に移行することをEntity Frameworkに伝えることだけです。
  • このメソッドには、使用する connectionString であるパラメーターが必要です。

以下は、 Startup.cs ファイルの完全な実装です。

using Microsoft.AspNet.Mvc;

using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;

using System.Collections.Generic;
using System.Linq;

namespace FirstAppDemo.Controllers {
   public class HomeController : Controller {
      public ViewResult Index() {
         var employee = new Employee { Id = 1, Name = "Mark Upston1" };
         using (var context = new

         FirstAppDemoDbContext()) {
            SQLEmployeeData sqlData = new SQLEmployeeData(context);
            sqlData.Add(employee);
         }

        //var employee = new Employee { ID = 1, Name = "Mark Upston" };
         return View(employee);
      }
   }
   public class SQLEmployeeData {
      private FirstAppDemoDbContext _context { get; set; }
      public SQLEmployeeData(FirstAppDemoDbContext context) {
         _context = context;
      }
      public void Add(Employee emp) {
         _context.Add(emp);
         _context.SaveChanges();
      }
      public Employee Get(int ID) {
         return _context.Employees.FirstOrDefault(e => e.Id == ID);
      }
      public IEnumerable<Employee> GetAll() {
         return _context.Employees.ToList<Employee>();
      }
   }
}

次に、データベースをセットアップする必要があります。 データベースを設定する1つの方法は、Entity Frameworkを使用してデータベースを作成することです。これは2段階のプロセスです-

最初のステップ

これには以下が含まれます-

  • プロジェクトに移行コードを追加します。
  • 移行コードは* C#*コードです。 これを実行して、データベーススキーマにデータベースを作成できます。
  • Entity Frameworkは、この移行コードを生成できます。
  • Entity Frameworkはデータベースとモデルを見て、アプリケーションを機能させるためにスキーマの変更が必要なものを見つけます。
  • したがって、追加のモデルを追加したり、Employeeクラスなどの既存のモデルに変更を加えたりする場合、プロジェクトに移行を追加し続け、データベーススキーマの同期を維持できます。

第二段階

これには以下が含まれます-

  • ここでは、これらの移行を明示的に適用してデータベースを更新する必要があります。
  • これらのタスクは両方とも、コンソールウィンドウからいくつかの簡単なコマンドを使用して実現できます。
  • project.jsonを作成しました。
  • そのため、「ef」がEntityFramework.Commandsにマップされるコマンドを追加するためにproject.jsonを作成しました。

Visual Studioの開発者コマンドプロンプトを開いて、移行を追加して移行を適用するために必要なコマンドを実行します。 これを行う最も簡単な方法は、アプリケーションのルートディレクトリに移動することです。

開発者コマンドプロンプト

project.jsonファイルがあるフォルダーにいる場合は、正しいフォルダーにいます。 ここでは、dnvmと呼ばれるコマンドを実行する必要があります。 これは、使用するランタイムをシステムに通知する.NETバージョンマネージャーです。

次のコマンドを使用してみましょう。

dnvm list

Enterキーを押すと、次の出力が表示されます。

コマンドプロンプトでの出力

特定のランタイムを使用することを dnvm に伝える必要があります。 これにより、実行するdotnetコマンドまたはdnxコマンドにアクセスできます。

次のコマンドを実行します。

dnvm use1.0.0-rc1-update1 -p

Enterを押します。

DNVM

*dnvm* は、このdnxユーティリティへのアクセスを可能にするbinディレクトリを含むようにパスと環境変数を設定します。 *dnx ef* コマンドを実行してみましょう。

DNX EFコマンド

これは.NET実行環境であり、dnxを使用して、project.jsonファイルにリストしたコマンドを呼び出すことができます。 これらのコマンドの実行は一般的に非常に簡単です。 dnx efと入力すると、ヘルプ画面が表示されます。 すべてのオプションを覚えておく必要はありません。 Entity Frameworkコマンドから使用可能なコマンドを確認できますが、そのうちの3つがあります。

まず、移行を追加して次のコマンドを実行する必要があります。

dnx ef migrations add v1

Enterを押します。

DNX EF Migrations

Entity Frameworkはそのコンテキストを見つけ、内部にあるモデルを調べます。 以前の移行がないことがわかっているため、最初の移行が生成されます。 ここで、v1はデータベースのバージョン1です。 ソリューションエクスプローラーで新しいフォルダーを作成し、コードを生成します。

Entity Framework

移行は基本的に、SQLデータベースのスキーマを変更するSQLコマンドを生成するために使用されるC#コードです。

using System;
using System.Collections.Generic;

using Microsoft.Data.Entity.Migrations;
using Microsoft.Data.Entity.Metadata;

namespace FirstAppDemo.Migrations {
   public partial class v1 : Migration {
      protected override void Up(MigrationBuilder migrationBuilder) {

         migrationBuilder.CreateTable(name: "Employee", columns: table => new {
            Id = table.Column<int>(nullable: false)
               .Annotation("SqlServer:ValueGenerationStrategy",
               SqlServerValueGenerationStrategy.IdentityColumn),
               Name = table.Column<string>(nullable: true)
         },
         constraints: table => {
            table.PrimaryKey("PK_Employee", x => x.Id);
         });
      }
      protected override void Down(MigrationBuilder migrationBuilder) {
         migrationBuilder.DropTable("Employee");
      }
   }
}

Employeesというテーブルが作成されることがわかります。

  • このテーブルには、ID列とName列の2つの列が必要です。
  • 慣例により、Entity Frameworkは、Idというプロパティがあることを認識すると、そのプロパティを作成するか、その列をデータベースのプライマリキーにします。
  • ここでは、SQL Serverを使用します。 既定では、Entity FrameworkはそれをIdentityColumnにします。つまり、SQL ServerがIDを生成します。

dnx ef database update 」コマンドを入力して、これらのIDをデータベースに適用します。

DNX EFデータベース更新

コマンドが移行を適用したことがわかります。

次に、SQL Serverオブジェクトエクスプローラーに移動してデータベースを更新します。FirstAppDemoデータベースがあることがわかります。

SQL Server Object Explore

Employeeテーブルも確認できます。また、ID列が主キーであるテーブルの列を確認することもできます。

dbo.Employeeテーブルを右クリックして、[データの表示]を選択します。

DBO従業員

アプリケーションを実行する前に、データを追加しましょう。 アプリケーションを起動すると、データベースのデータが表示されるはずです。

ここにデータの行をいくつか追加してみましょう。

行データのカップル

index.cshtmlファイルを更新しましょう。 すべてのデータが表形式で表示されます。

@model FirstAppDemo.Controllers.HomePageViewModel
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
       <title>Home</title>
   </head>

   <body>
      <h1>Welcome!</h1>

      <table>
         @foreach (var employee in Model.Employees) {
            <tr>
               <td>
                  @Html.ActionLink(employee.Id.ToString(), "Details", new
                     { id = employee.Id })
               </td>
               <td>@employee.Name</td>
            </tr>
         }
      </table>
   </body>
</html>

アプリケーションを実行すると、次の出力が生成されます。

最終出力