ASP.NET Core 2.0からデータベースアクセスをしよう
進化した「ASP.NET Core 2.0」新しいWeb開発手法を学ぶ 第5回
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の新機能を試していきます。
参考資料
この記事は参考になりましたか?
既に会員の方はを行ってください。
- 進化した「ASP.NET Core 2.0」新しいWeb開発手法を学ぶ連載記事一覧
-
- ASP.NET Core 2.0アプリケーションをデプロイしてみよう
- Entity Framework Core 2.0の新機能を使おう
- ASP.NET Core 2.0からデータベースアクセスをしよう
- この記事の著者
-
WINGSプロジェクト 秋葉 龍一(アキバ リュウイチ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
