ASP.NET Core 1.0がリリースされて久しいですが、いっこうにMySQLでの利用サンプル(特にモデルファースト)が無いので調べてみた結果をとりあえずメモ。
この記事は古いので、2017年5月編をご覧くさい。
環境
- OS:El Capitan(Sierraでも問題なし)
 - MySQL 5.5(MAMP付属のもの)
 - .NET Coreは1.0(ここからダウンロードしてインストール)
 - yo(テンプレート生成)
 
環境構築については私の記事もありますが、少々古いのでここが参考になるかと。
どのプロバイダを使うか?
マイクロソフトのサンプルページでは下記の3種類紹介されています。
Official
MySQLのオフィシャルらしい。が、更新が夏頃からされておらずやる気が感じられない。
このページなどが参考になる。
Pomelo
雰囲気良さそう。GitHubの情報で何とかなりそう。
Sapient Guardian
Pomeloに比べるとGitHub上の活性は低いかな。。。
というわけでとりあえずPomeloとやらを利用してみることにします。
MySQLからデータを取得してみる
とりあずSELECTしてみる。タイトルはASP.NETとしたが、コードが複雑になるのでConsoleアプリとして実装してみます。
MySQLにテーブルを作成する
今回はサンプルなので簡単なテーブルにします。なお、Entity Frameworkを利用するにはテーブルに主キーが必要なので定義しておきましょう。
membersというテーブルを作り、idとnameとemailのカラムを作ります。
サンプルデータもインサートしておきます。
# CREATE TABLE
create table members(
	id int primary key auto_increment,
	name varchar(32),
	email varchar(64)
);
# SAMPLE INSERT
insert into members(name,email) values('hoge','hoge@hoge.com');
insert into members(name,email) values('foo','foo@foo.com');
yoでConsole Applicationテンプレートを生成
yo -> ASP.NET -> Console Applicationと選択し、テンプレートを生成します。
初期状態で下記3つのファイルが出来ているはずです。
- .gitignore
 - Program.cs
 - project.json
 
必要なのは下記2つだけ。
project.jsonの編集
project.jsonのdependenciesにPomeloを追加し、restoreします。
以下、dependenciesだけ抜粋。
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    },
+    "Pomelo.EntityFrameworkCore.MySql": "1.1.0-*",
+    "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
  },
package.jsonを編集したら忘れずにrestoreし、必要なファイルを取得します。
dotnet restore
Program.csを編集
本当はModelを別クラスにした方が分かりやすいですが、面倒なのでProgram.csに全て書きます。
Entity Frameworkを経由してデータベースを利用するためには、
- テーブルに相当するModelクラス
 - テーブル(データベース)とモデルクラスをマップするContextクラス
 
の2つを最低限定義する必要があります。以下の通り定義します。
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace myapp1
{
    public class Program
    {
        //Model
        public class Member
        {
            public int id {get; set;}
            public string name {get; set;}
            public string email {get; set;}
        }
        //Context
        public class MyContext : DbContext
        {
            public DbSet<Member> Members {get; set;}
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
                => optionsBuilder.UseMySql(@"server=localhost;database=testdb;uid=root;pwd=root;");
        }
        //Main
        public static void Main(string[] args)
        {
            using(var context = new MyContext())
            {
                var ret = context.Members
                    .ToList();
                foreach(var x in ret)
                {
                    Console.WriteLine($"{x.name} {x.email}");
                }
            }
        }
    }
}
実行する
コーディングが完了したら実行します。
dotnet run
hoge hoge@hoge.com
foo foo@foo.com
うまくいったようです。
その他
いちおう挿入・更新・削除なども。usingステートメントの中に書きましょう。
Linq使うとか、LIKEはどうすんだ?とかいろいろありますが、それはEntity Frameworkの使い方調べましょう。
//insert
var member = new Member();
member.name = "tanaka";
member.email = "tanaka@test.com";
context.Add(member);
context.SaveChanges();
//update
var member = context.Members.Single(x=> x.name == "tanaka");
member.name = "suzuki";
context.SaveChanges();
//delete
var member = context.Members.Single(x=> x.name == "suzuki");
context.Members.Remove(member);
context.SaveChanges();