Entity Framework Core 2.0を使ってデータベースアクセスするアプリを作ろう(サーバサイド編)
次にASP.NET Core 2.0のプロジェクトを作成します。ここでは、前回と前々回で紹介したSPAテンプレート(Angular)を使います。
コマンドラインから「dotnet new angular -o efcore2」で新規プロジェクトを作成します。
プロジェクト作成後、Entity Fremework Core 2.0のパッケージをプロジェクトに追加します。今回はRDBにSQL Server 2017を使用しているため、SQL Server用のパッケージを指定します。
$ dotnet add package Microsoft.EntityFrameworkCore.SqlServer -V 2.0.1
エンティティの作成
データベースのテーブルに対応するエンティティクラスを作成します。ここではプロジェクトフォルダ直下に「Models」フォルダを作成し、その中にBlog.cs、Post.csを作成していきます。
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace efcore2.Models { [Table("blog")] public class Blog { [Key] public string blog_id { get; set; } public string blog_title { get; set; } public string author { get; set; } public bool delete_flg { get; set; } } }
Table、Key属性は任意でエンティティに付与することのできる属性です。
Entity Frameworkではエンティティのクラス名と一致するDBのテーブルをマッピングするように設計されていますが、クラス名とテーブル名を一致させることができない場合などに、Table属性のパラメータに指定したテーブル名でもマッピングができるようになります。
一方、主キーはEntity Frameworkの規則として、IDまたはテーブル名+IDの名前を持つプロパティにマッピングされます。テーブルと同様に、規則と異なるプロパティ名でマッピングをしたい場合はKey属性を付与することで、主キーとひも付けることができます。
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace efcore2.Models { [Table("post")] public class Post { [Key] public string post_id { get; set; } public string blog_id { get; set; } public string post_title { get; set; } public bool delete_flg { get; set; } } }
作成したエンティティクラスはPOCO(Plain Old CLR Object)です。これらのオブジェクトにはEntity Framework Coreの持つ機能は含まれておらず、次に説明するコンテキストクラスによってDBのテーブルとひも付けがなされます。
コンテキストの作成
続いてコンテキストクラスを作成します。コンテキストクラスではDBの接続先の指定とエンティティクラスのコンテキストへの登録を行っています。エンティティクラス同様、「Models」フォルダ内にEfcore2Context.csとして作成します。
using efcore2.Models; using Microsoft.EntityFrameworkCore; namespace efcore2.Models { // DbContextを継承する ・・・(1) public class Efcore2Context : DbContext { // コンストラクタでDbContextOptionsを受け取りスーパークラスへ提供・・・(2) public Efcore2Context(DbContextOptions<Efcore2Context> options) : base(options) {} // エンティティのコンテキストへの登録 ・・・(3) public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } }
コンテキストクラスは「Microsoft.EntityFrameworkCore.DbContext」を継承して作成します(1)。
コンストラクタではDbContextOptionsを受け取り、スーパークラス(DbContext)へそのまま渡しています(2)。このDbContextOptionsは後述するStartup.csで生成しており、データベースの接続先を定義しています。
最後にエンティティですが、このクラスにDbSet型のパブリックなプロパティとして記述することでコンテキストに登録され、テーブルとマッピングされるようになります(3)。
Entity Frameworkではこのコンテキストクラスを起点として、データベースアクセスのコードを記述することになります。
Startup.csにコンテキストインスタンスの生成コードを追加
ASP.NET Coreでは、コンテキストクラスはアプリケーションの開始時に生成(インスタンス化)することで、アプリケーションで単一のコンテキストインスタンスを保持し、再利用できるようになります。コンテキストクラスではデータベースへの接続などコストの高い処理を行っているため、都度生成せずにひとつのインスタンスを使いまわす方が効率的になります。
・・・中略 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); // 以下のコードを追加 services.AddDbContext<Efcore2Context>(options => options.UseSqlServer("Server=localhost;Database=efcore2;User ID=sa;Password=P@ssw0rd")); } ・・・中略
services.AddDbContextメソッドでコンテキストのインスタンスを生成しています。引数の中ではoptions(DbContextOptions型)のUseSqlServerメソッドを使って接続先を指定しています。このoptionsが前述のコンテキストクラスのコンストラクタに渡される仕組みとなっています。
おわりに
今回はEntity Framework Core 2.0の概要とデータベースのセットアップ、アプリケーション側でのエンティティとコンテキストの実装までを行いました。次回はクライアント側の実装を行ってアプリケーションを完成させた後、Entity Framework Core 2.0の新機能を試していきます。