EntityFramework CoreのMigrationを使ってデータベースを作成する

EntityFramework CoreのMigrationを使ってデータベースを作成する方法について、Visual Studio Codeを使った場合の方法があまり見つからなかったので、まとめてみました。
※主に以下のMicrosoft Docsのページを参考にしました。
[Getting Started with EF Core on ASP.NET Core with a New database](https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db?tabs=visual-studio "Getting Started with EF Core on ASP.NET Core with a New database")

# 環境
OS : macOS Mojave
エディタ : Visual Studio Code
.NET Core : version2.2
データベース : SQLServer on docker

# プロジェクト作成
任意のフォルダを作成し、そこにMVCのプロジェクトを作成します。
フォルダに移動した状態で、以下のコマンドを実行します。(今回は、"EFSample"というフォルダで作成してます）

```terminal:terminal
dotnet new mvc
```
そしてVS Codeで開くと、以下の画像のようにプロジェクトが作成されています。
![YlnVIvNyQ0u1YXqGlBACEQ_thumb_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301034/6d5527ab-5b35-319c-f4a6-edcddf4003ce.jpeg)

# Entity Framework Core インストール
　Entity Framework Coreをインストールします。今回は、SQLServerをインストールするため、以下のコマンドを実行します。

```terminal:terminal
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
```

#Modelクラスの作成
まず、データベースのテーブルとマッピングさせるための、Modelクラスを作成します。
今回は、**"Book"**という本のタイトルと、著者名だけを持つ単純なテーブルを作成します。
プロジェクトの、"Models"フォルダ配下に、**Book.cs**というファイルを作成し、以下のコードを書きます。

```csharp:Book.cs
namespace EFSample.Models
{
    public class Book
    {
        public int id {get;set;}
        public string Title {get;set;}
        public string Author {get;set;}
    }
}
```
次に、コンテキストクラスを作成します。これにより、データベースと先ほどのModelを関連づけます。
同様に、"Models"フォルダ配下に、**SampleContext.cs**というファイルを作成し、以下のコードを書きます。

```SampleContext.cs
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EFSample.Models
{
    public class SampleContext : DbContext
    {
        public SampleContext(DbContextOptions<SampleContext> options)
            : base(options){ }
        
        public DbSet<Book> Book { get; set; }
    }
}
```


#接続文字列の設定
データベースへの接続文字列を**appsettings.json**に追記します。
※各値は、実際の環境に合わせて変更して下さい。
Server : サーバ名 or IPアドレス
Database : データベース名
Trusted_Connection : Falseの場合は、SQLServer認証
User ID,password : SQLServer認証のID,PASS

```json:appsettings.json
  "ConnectionStrings": {
    "SampleContext": "Server=localhost;Database=Sample;Trusted_Connection=False;User Id=(userid);password=(password);"
  }
```

#Startup.csの登録
コンテキストクラスに接続文字列を設定するために、using句と**Startup.cs**の**ConfigureServices**メソッドに以下の部分を追加します。

```csharp:Startup.cs(using句)
using EFSample.Models;
using Microsoft.EntityFrameworkCore;
```


```csharp:Startup.cs

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            //以下の行を追加
            services.AddDbContext<SampleContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SampleContext")));
         
        }
```

#データベースの作成
Migrationを実行して、データベースを作成します。
まず、このコマンドを実行するとデータベース作成の元となるファイルが、Migrationsフォルダに作成されます。

```terminal:terminal
dotnet ef migrations add InitialCreate 
```

最後に、次のコマンドを実行すると実際にデータベースが作成されます。

```terminal:terminal
dotnet ef database update
```

#結果
SQLServerに接続して、Bookテーブルが作成されていることを確認できました。
<img width="372" alt="スクリーンショット 2019-04-16 21.02.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301034/5db4ba4c-3266-51e6-8a02-f21a4df0f229.png">

#おわりに
Windowsであれば、VisualStudioのGUIや、PowerShellで行うところを、.NET Core CLIを使って実行することができました。せっかくのクロスプラットフォームなので、Windows以外で行う方法を色々試してみたいと思います。