visualstudiocodeからC#のentityframworkでpostgresqlにアクセスをする

# はじめに
C#の開発はVisual Studioが定番ですが、個人的に起動の早いVisual Studio Codeを使用しています。Visual Studioが優秀だからか、C#を調べたときに出てくる内容も大抵Visual Studioでした。そこで、Visual Studio CodeでC#の環境作成からEntityFramworkでPostgresにアクセスするまでをまとめました。


# 環境
 - Windows:10

# 必要な環境の作成
## .NETのインストール
[Microsoftの公式ページ](https://dotnet.microsoft.com/download)から.NET Core Runtime と .NET Core SDKのインストールをします。

## プロジェクトの生成
1. プロジェクトを作成したいディレクトリをVSCodeで開く。
2. VSCode上でCtr + Shift + @ を押し、ターミナルを開く。
3. ターミナル上で``` dotnet new console ``` を入力する。

## EntityFramwork Coreのインストール
1. ターミナル上で``` dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL ``` を入力する。

# プログラムの作成
EntityFramworkではテーブルに紐づいたModelクラスとユーザが使用するためのContextクラスを作成して使用します。
Contextクラスは、テーブル結合やサブクエリの結果などユーザの使用する最終的なテーブルの形を定義しています。
Modelクラスは、テーブルと1対1で作成してカラムやキーを定義しています。

## Modelクラスの作成
Modelクラスは、```[Table(テーブル名)```でテーブルとクラスを紐づけて、```[Key]```で主キー、```[Column(カラム名)]```でカラムとクラス変数の定義をします。使用方法は、Context経由で使用するためこのクラスは単純なデータクラスとして扱います。

``` EFMod.cs 
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;

namespace DBSample.EF
{
    [Table("pets")]
    public class PetModel
    {
        [Key]
        [Column("id")]
        public int Id {set;get;}
        [Column("name")]
        public string Name{set;get;}
        [Column("age")]
        public int Age{set;get;}
        [Column("birthday")]
        public DateTime Birthday{set;get;}
    }
}
```
## Contextクラスの作成
Contextクラスは、ユーザが直接使用するクラスになります。下の例では```PetsContext```がそのクラスになります。
このクラスにクラス変数として```public DbSet<Modelクラス名> 変数名 { get; set; }```のように定義します。
複数のモデルクラスを定義すると、このContextを通じてテーブル結合などができます。さらに、```OnConfiguring```ではDBの定義やログの定義など設定をします。


``` EFMod.cs 
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;

namespace DBSample.EF
{
    [Table("pets")]
    public class PetModel
    {
        [Key]
        [Column("id")]
        public int Id {set;get;}
        [Column("name")]
        public string Name{set;get;}
        [Column("age")]
        public int Age{set;get;}
        [Column("birthday")]
        public DateTime Birthday{set;get;}
    }

    public class PetsContext: DbContext
    {
        public DbSet<PetModel> PetModels { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseNpgsql("Host=localhost;Port=5431;Username=postgres;Password=postgres;Database=animal_db");
        }
    } 
}
```


## 呼び出してDBアクセスをする
DBアクセスをするときは、上で作成したContextクラスのインスタンスを生成するだけでできます。
例では、純粋にselectをした結果を表示しているだけになります。見てわかるように直接使用するのはContextクラスになります。その後、Contextクラスを経由してModelクラスを操作しています。


``` Program.cs
using System;
using DBSample.EF;

namespace DBSample
{
    class Program
    {
        static void Main(string[] args)
        {
            PetsContext contexts = new PetsContext();

            foreach(var PetModel in contexts.PetModels)
            {
                Console.WriteLine("id:{0}, name:{1}, age:{2}, birthday:{3}", PetModel.Id, PetModel.Name, PetModel.Age, PetModel.Birthday);
            }

            Console.WriteLine("Hello World!");
        }
    }
}
```

結果

```
PS C:\DBSample> dotnet run
id:1, name:pochi, age:3, birthday:2019/11/07 21:43:05
id:2, name:tama, age:3, birthday:2019/11/07 21:43:21
id:3, name:wan, age:1, birthday:2019/10/28 21:43:50
id:4, name:mike, age:2, birthday:2019/10/28 21:44:11
Hello World!

```

## デバックできるようにする
dotnetコマンドではデバック実行ができないため、VSCodeでデバックできるようにします。

1. プロジェクトを作成したいディレクトリをVSCodeで開く。
2. C#のファイルを開くとC#用Extensionのインストールの案内が出るのでインストールします。
3. VSCode上でCtr + Shift + D を押し、デバックウィンドウを開く。
4. デバックでは``` .NET Core Launch(console) ``` を選択して実行する。


# おわりに
EntityFramworkをVSCodeで簡単に使用することができました。EntityFramworkはC#でDBアクセスするメジャーな方法なのでこれからもう少し見ていこうかと思います。なんとなくただのORマッパーではないことは理解していますが、具体的にまとめていけたらと思います。