ASP.NET Core MVC 3.1 でスキャフォールディングを試した時の備忘録

#はじめに
ASP.NET Core MVC のスキャフォールディングを試した時の備忘録です。

#目標
連絡帳アプリ**ContactBook**
<img width="1352" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107554/0b1088b3-ff99-3874-2183-7e5031fbe5d8.png">

#環境
- ASP.NET Core MVC 3.1
- MySQL 8.0
- Mac Catalina
- Visual Studio Code

#準備
下記のようにASP.NET CoreやEntityFramework等をインストールしておきます。
必要であれば、MySQL 8.0をhomebrewでインストールしておきます。

##ASP.NET Core 3.1 SDKをインストール
下記からASP.NET Core SDKをダウンロードし、Macにインストールします。
[Download .NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.1)

##EntityFramwork、aspnet-codegeneratorをインストール

```terminal:ターミナル
dotnet tool install --global dotnet-ef
dotnet tool install --global dotnet-aspnet-codegenerator
```

#手順
手順詳細はMicrosoft Docsに開発環境別に載っています。

##MVCプロジェクト新規作成
Visual Studio CodeのターミナルからMVCプロジェクトを作成します。

```terminal:ターミナル
mkdir ContactBook
cd ContactBook
dontnet new mvc
```

##NuGetでパッケージをインストール
EntityFrameworkやスキャフォールディングに必要なパッケージをインストールします。

```terminal:ターミナル
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.SqlServer
dotnet add package Pomelo.EntityFrameworkCore.MySql
```

##モデルを作成
連絡先のモデルを作成します。

```c#:ContactBook/Models/Contact.cs
namespace ContactBook.Models
{
    public class Contact
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public string Address { get; set; }
    }
}
```

##DBコンテキストを作成
モデルとDBをつなぐDBコンテキストを作成します。

```c#:ContactBook/Models/ContactBookContext.cs
using Microsoft.EntityFrameworkCore;

namespace ContactBook.Models
{
    public class ContactBookContext : DbContext
    {
        public ContactBookContext(DbContextOptions<ContactBookContext> options)
            : base(options) { }

        public DbSet<Contact> Contact { get; set; }
    }
}
```

##DBコンテキストを登録
Startup.csにDBコンテキストを登録します。
MySQLの接続文字列はAppSettingsに設定しました。

```c#:ContactBook/Startup.cs
using ContactBook.Models;
using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
using Pomelo.EntityFrameworkCore.MySql.Storage;
```
```c#:ContactBook/Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<ContactContext>(options =>
        options.UseMySql(Configuration.GetConnectionString("ContactBook"), mySqlOptions => mySqlOptions
        .ServerVersion(new ServerVersion(new Version(8, 0, 19), ServerType.MySql))));
}
```
```json:ContactBook/appsettings.json
{
  "ConnectionStrings": {
    "ContactBook": "Server=localhost;Database=ContactBook;User=root;Password=****************"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
```

##マイグレーション
データベースを作成します。

```terminal:ターミナル
dotnet ef migrations add InitialCreate;
dotnet ef database update
```

##スキャフォールディング
asp-condegeneratorでコントローラーを作成します。
ついでに既定のビューも作成します。

```terminal:ターミナル
dotnet aspnet-codegenerator controller -name ContactsController -m Contact -dc ContactBookContext -ourDir Controllers -udl -script
```

##デバッグ実行
デバッグ実行を行うとブラウザが起動するので、下記URLにアクセスします。
https://localhost:5001/Contacts

# 参考
- [MacでASP.NET Core + EntityFramework Core + MySQL な開発を行う方法](https://www.aruse.net/entry/2018/09/08/234926)
- [Microsoft Docs - ASP.NET Core MVC の概要](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-mvc-app/start-mvc?view=aspnetcore-3.1&tabs=visual-studio-code)
- [Microsoft Docs - dotnet aspnet-codegenerator](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/tools/dotnet-aspnet-codegenerator?view=aspnetcore-3.1)