対象読者
- 新しいASP.NET Coreの機能について知りたい方
- MacやLinuxなどでASP.NET Coreアプリケーションを動かしたい方
- Entity Framework Coreの新機能について知りたい方
検証環境
本稿では、以下の環境で動作を確認しています。
- macOS Sierra 10.12.6
- .NET Core 2.0
Entity Framework Coreとは
まず、Entity Frameworkについて説明します。Entity Frameworkは.NET Frameworkランタイム上で使用することができるデータアクセスライブラリです。Entity FrameworkはRDBへのデータアクセスを行い、結果をオブジェクトにマッピングするいわゆるORM(Object/Relation Mapping)フレームワークに位置づけられます。2008年に最初のバージョンが公開されてから.NET Frameworkの進化とともに機能や性能が洗練されてきました。
Entity FrameworkはORMとしての機能以外にも、既存のデータベース情報をもとにエンティティオブジェクトを自動生成したり、反対にエンティティオブジェクトからデータベースのテーブルを作成したりするマイグレーションの機能も備えています。なお、これらの自動生成機能は前者がデータベースファースト(あるいはモデルファースト)、後者がコードファーストと一般的に呼ばれています。
このEntity Frameworkのクロスプラットフォーム版にあたるのが、Entity Framework Coreです。
Entity Framework Core 2.0とは
前述の通り、Entity Framework Coreはさまざまなプラットフォームで稼働できるEntity Frameworkです。Entity Frameworkが.NET Framework上でのみ動作するのに対し、Entity Framework Coreは、.NET Core、.NET Framework、Mono、Xamarin、UWP(Universal Windows Platform)で動作させることができます。そのため、コードの移植が容易である、ASP.NET Coreと同様の特徴を持っています。
以下は、Entity Framework Core 2.0のリリースアナウンスで紹介されている2.0の新機能です。
- LINQでのLikeオペレータの使用
- SQL文での文字列補完
- テーブル分割
- グローバルクエリフィルタ
- DBコンテキストのプール
これらの機能については次回、実装を通して詳細を確認していきます。
Entity Framework Core 2.0を使ってデータベースアクセスするアプリを作ろう(データベースのセットアップ編)
ここからは実際にEntity Framework Core 2.0を使ってデータベースへアクセスするアプリケーションを作成していきます。RDBMSにはSQL Server 2017を使用しますが、macOSやLinuxでも動作できるように今回はDocker上でSQL Serverを起動する方法で説明をしていきます。
Dockerが未インストールの場合は公式サイトから対応するプラットフォームのものをインストールしてください。
SQL Server 2017のセットアップ
Docker上で稼働させることのできるSQL Server 2017がMicrosoftより提供されているため、こちらを使用してSQL Serverをセットアップしていきます。
セットアップはコマンドラインでリスト1のdockerコマンド1行を実行するだけで完了します。
$ docker run -d --name mssqlserver -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=P@ssw0rd' -e 'MSSQL_PID=Developer' -e 'MSSQL_LCID=1041' -p 1433:1433 microsoft/mssql-server-linux:2017-latest
「docker run」コマンドは新たにDockerコンテナを新規作成・起動するためのコマンドです。コマンド末尾の「microsoft/mssql-server-linux:2017-latest」がコンテナのイメージを指定している部分で、Dockerの公式リポジトリからSQL Server 2017のイメージをダウンロードしています。
そのほか、いくつか指定しているオプションの意味については以下の表を参照してください。
オプション | 説明 |
---|---|
-d | dockerプロセスをバックグラウンドで実行 |
--name | dockerコンテナの名前を指定 |
-e 'ACCEPT_EULA=Y' | SQL Serverの利用規約に同意する |
-e 'SA_PASSWORD=' | SQL Serverのパスワード |
-e 'MSSQL_PID=Developer' | SQL Serverのエディションの設定 |
-e 'MSSQL_LCID=1041' | SQL Serverのロケールの設定。1041は日本語ロケール |
-p 1433:1433 | dockerを起動しているマシンとdocker内でのポートのひも付け(ポートフォワーディング) |
オプションのうち、--nameオプションを使って指定したコンテナの名称は、コンテナの停止や再度コンテナを起動する際に使用することができます。
# コンテナの停止 $ docker stop mssqlserver # コンテナの起動(2回目以降) $ docker start mssqlserver
sqlcmdコマンドラインツールのインストール
次は、WindowsとmacOSのコマンドラインからSQLを実行することができるsqlcmdユーティリティをインストールします。こちらのインストールは必須ではないため、他にSQL Serverに接続できるクライアントアプリケーションをお持ちの場合はスキップしても構いません。
Windowsの場合は、インストーラをダウンロードしてセットアップをしてください。macOSの場合は、Homebrewを使ってsqlcmdをインストールすることができます。リスト3は、Homebrewでのインストール手順です。
$ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release $ brew update $ ACCEPT_EULA=y brew install --no-sandbox msodbcsql mssql-tools
データベース、テーブルの作成
続いてデータベースとテーブルを作成します。今回はデータベース名を「efcore2」とし、「blog(ブログ)」と「post(ブログの記事)」という2つのテーブルを作成します。
sqlcmdを使いCREATE DATABASE文を発行します。
$ sqlcmd -S localhost -U SA -P 'P@ssw0rd' -Q "CREATE DATABASE efcore2"
sqlcmdのオプションですが、「-S」はサーバ名、「-U」はサーバのログインID、「-P」はパスワードです。
サーバ名はlocalhostを指定します。DockerはあくまでOSのプロセスのひとつにすぎないため、localhostで接続することができます。サーバ名のSAはSQL Serverの管理者アカウント名です。パスワードはDockerコンテナ作成時に設定したものを使用します。
テーブルも同様にsqlcmdからCREATE TABLE文で作成します。
# blogテーブルの作成 $ sqlcmd -S localhost -U SA -P 'P@ssw0rd' -Q "CREATE TABLE efcore2.dbo.blog\ (\ blog_id CHAR(5) PRIMARY KEY NOT NULL,\ blog_title NVARCHAR(128),\ author NVARCHAR(128),\ delete_flg BIT\ );" # postテーブルの作成 $ sqlcmd -S localhost -U SA -P 'P@ssw0rd' -Q "CREATE TABLE efcore2.dbo.post\ (\ post_id CHAR(5) PRIMARY KEY NOT NULL,\ blog_id CHAR(5),\ post_title NVARCHAR(128),\ post_detail NVARCHAR(256),\ created_date DATETIME,\ delete_flg BIT,\ CONSTRAINT post_blog_fk FOREIGN KEY (blog_id) REFERENCES blog (blog_id)\ );"
データベースのセットアップの最後に、blogテーブルとpostテーブルへデータ登録を行います。
# blogテーブルへのデータ登録 $ sqlcmd -S localhost -U SA -P 'P@ssw0rd' -Q "\ INSERT INTO efcore2.dbo.blog (blog_id, blog_title, author, delete_flg) VALUES ('10000', 'ASP.NET Core 2.0を学ぶ', 'akiba', 0);\ INSERT INTO efcore2.dbo.blog (blog_id, blog_title, author, delete_flg) VALUES ('20000', 'EntityFramework Core 2.0のいろは', 'yamada', 0);\ INSERT INTO efcore2.dbo.blog (blog_id, blog_title, author, delete_flg) VALUES ('99999', 'ASP.NET Core 1.0について', 'akiba', 1);\ " # postテーブルへのデータ登録 $ sqlcmd -S localhost -U SA -P 'P@ssw0rd' -Q "\ INSERT INTO efcore2.dbo.post (post_id, blog_id, post_title, post_detail, created_date, delete_flg) VALUES ('10001', '10000', 'Razor Pagesを知る', 'Razor PagesはASP.NET Core 2.0から導入された新機能です。ページコーディングの多いアプリケーションで重用されるように設計されており...', '2018-01-01 00:00:00.000', 0);\ INSERT INTO efcore2.dbo.post (post_id, blog_id, post_title, post_detail, created_date, delete_flg) VALUES ('10002', '10000', 'SPAテンプレートを使ってみる', 'ASP.NET CoreではView層にSPA(Single Page Application)を実現するJavaScriptフレームワークを使い、Webアプリケーションを作成することもできます...', '2018-01-01 00:00:00.000', 0);\ INSERT INTO efcore2.dbo.post (post_id, blog_id, post_title, post_detail, created_date, delete_flg) VALUES ('20001', '20000', 'EntityFramework Core 2.0の概要', 'Entity Frameworkは.NET環境で使用することのできるデータベースアクセスのフレームワークです。そのEntity Frameworkのクロスプラットーム版である...', '2018-01-01 00:00:00.000', 0);\ "
以上でデータベースのセットアップは完了です。