macOS環境でASP.NET COREのWEBアプリをMySQLに接続した

## MySQLにデータベース作成

最近ASP.NETでWEBアプリ開発してますが、macOS版の情報無さすぎワロタ。
なのでささやかながらvisual studio for macの情報を共有していきたいと思います。

今回は、ASP.NETとMySQLを接続する方法について書いていきます。

プロジェクトを作成する段階から初めて行こうと思います。

まずvisual studio for macを起動して。
new→Webアプリケーション（MVC）→認証無しと続き、
プロジェクト名は「TestApp」 としておきます。

MySQLにデータベースを作るのが目的ですが、接続した後に確認ができる様にコントローラーとビューをいじっていきます
今回は新しく「TestController」を作ります
Controllersディレクトリ上で右クリックして「追加」→「コントローラークラス」で名前をつけます
<img width="1440" alt="e1696e707444bf493f17e0ce5b73dc1e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/ac9cc3f6-d351-df6d-614a-cb8e71f7c9a5.png">

「Views」ディレクトリのなかに「Test」ディレクトリ、その中に「Razorページ」で「Index.cshtml」を作成します。
奈きみはこの様に記述します。<img width="1438" alt="c0c4e1b4c501b6ad68909b0db53c932b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/4f0b3117-29c2-1b30-8ba9-c8a5b85ab647.png">

ここからモデルを操作します。
まずModelsディレクトリで右クリックし、「空のクラス」を作成、名前は「Book」します。
中身を下記の様に記述します。
この記述がカラムとデータ型を指定しています

```C#:Models/Book.cs
using System;
namespace TestApp.Models
{
    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int Price { get; set; }
    }
}
```

次にコンテキストを用意します。
Bookクラスで定義したデータをデータベースに橋渡しするのがコンテキストクラスの役割です。
コンテキストクラスを作成する前にNuGetで必要なパッケージをインストールします

```c#
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
MySql.Data
Pomelo.EntityFrameworkCore.MySql
```
<img width="317" alt="1ab7c7e3a0ab140f61d6bf2cbab76579.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/5d3e1914-f73e-652e-58c3-0832696678ae.png">


上記のパッケージをインストールできたら、
Bookクラス同様に空のクラスを作成し、下記の様に記述します。

```C#:Models/MyContext.cs
using System;
using Microsoft.EntityFrameworkCore;

namespace TestApp.Models
{
    public class MyContext :DbContext
    {
        public MyContext(DbContextOptions options):base(options)
        {
        }

        public DbSet<Book> Book { get; set; }
    }
}

```

appsettings.jsonを編集します

```C#:appsettings.json
{
  ~中略
　 "ConnectionStrings": {
    "DefaultConnection": "server=localhost;userid=username;database=TestApp;"
  }
}

```

最後にStartup.csを編集します。

```C#:Startup.cs
追記
using TestApp.Models;
using Microsoft.EntityFrameworkCore;

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            services.AddDbContext<MyContext>(options =>
                options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
        }
```

ここまでできたらターミナルに移ります。
作業ディレクトリはTestApp/TestApp、

```linux:ターミナル
dotnet ef migrations add TestApp
dotnet ef database update
```
このコマンドを打ち込めばMySQLにデータベースができているはずです
<img width="1440" alt="46d4f960d1c904a5446c94c321918b95.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/5ff6404d-06eb-f590-940e-65c4b90be4f3.jpeg">

## データベース呼び出し

せっかくなのでMySQLに直接データを打ち込んでデータ呼び出しまでやります。
TestControllerに以下を記述します。

```C#:Controllers/TestController.cs
using TestApp.Models;

namespace TestApp.Controllers
{
    public class TestController : Controller
    {
        public readonly MyContext _context;
        public TestController(MyContext context)
        {
            this._context = context;
        }
        public IActionResult Index()
        {
            return View(this._context.Book);
        }
    }
}
```

コンテキストのインスタンスを宣言し、コンストラクタで自身のフィールドに代入、
データを呼び出したいビューに、引数を入れてあげるという流れです。

ビューの方を記述してあげます。
予めMySQLに直でデータを打ち込んでいます。
呼び出しはforeach文を使って繰り返し表示してあげます。

```C#:Views/Test/Index.cshtml
@model IEnumerable<TestApp.Models.Book>

@{
    ViewData["Title"] = "Index";
}

<h1>List</h1>

<table>
    <thead class="table">
        <tr>
            <th>書名</th>
            <th>価格</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.Title</td>
                <td>@item.Price</td>
            </tr>
        }
    </tbody>
</table>
```

１行目では渡されたモデルに応じて@modelディレクティブでその型を宣言します。
中身はIEnumerable型になっています。
モデルにアクセスするためにはModelを使います。

これで呼び出し完了です。
ローカル環境でここまでの実装を最終確認するために、画面左上の三角マークをクリックしてhttps://localhost:ポートNo/Testでブラウザを開いてください。
<img width="1439" alt="1357eb49210583b87d1a4d9b194762f3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/0b008b22-6db6-597e-905c-7e94e895f18c.png">
こんな画面になっていたら実装完了です。

ここまでご覧いただきありがとうございました。
間違っていることがありましたらご指摘お願いします。

## ここまで調べるのに手間取ったこと

MySQLと接続するのに「MySQL.Data.EntityFrameworkCore」というパッケージNuGetでインストールして用いる方が結構いらっしゃいました。
私も最初はそちらでやりましたが、うまくいかず「Pomelo.EntityFrameworkCore.MySql」に切り替えまして、そちらでうまくいきました。
英語のStackOverFlowをみてみると「MySQL.Data.EntityFrameworkCore」と「Pomelo.EntityFrameworkCore.MySql」は共存できない様です。

また、多くの方はdotnet efコマンドを使うために「Microsoft.EntityFrameworkCore.Tools.DotNet」というパッケージをインストールしてましたが、前述のパッケージのみでイけました。