はじめに
C#の開発はVisual Studioが定番ですが、個人的に起動の早いVisual Studio Codeを使用しています。Visual Studioが優秀だからか、C#を調べたときに出てくる内容も大抵Visual Studioでした。そこで、Visual Studio CodeでC#の環境作成からEntityFramworkでPostgresにアクセスするまでをまとめました。
環境
- Windows:10
必要な環境の作成
.NETのインストール
Microsoftの公式ページから.NET Core Runtime と .NET Core SDKのインストールをします。
プロジェクトの生成
- プロジェクトを作成したいディレクトリをVSCodeで開く。
- VSCode上でCtr + Shift + @ を押し、ターミナルを開く。
- ターミナル上で
dotnet new console
を入力する。
EntityFramwork Coreのインストール
- ターミナル上で
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
を入力する。
プログラムの作成
EntityFramworkではテーブルに紐づいたModelクラスとユーザが使用するためのContextクラスを作成して使用します。
Contextクラスは、テーブル結合やサブクエリの結果などユーザの使用する最終的なテーブルの形を定義しています。
Modelクラスは、テーブルと1対1で作成してカラムやキーを定義しています。
Modelクラスの作成
Modelクラスは、[Table(テーブル名)
でテーブルとクラスを紐づけて、[Key]
で主キー、[Column(カラム名)]
でカラムとクラス変数の定義をします。使用方法は、Context経由で使用するためこのクラスは単純なデータクラスとして扱います。
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の定義やログの定義など設定をします。
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クラスを操作しています。
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でデバックできるようにします。
- プロジェクトを作成したいディレクトリをVSCodeで開く。
- C#のファイルを開くとC#用Extensionのインストールの案内が出るのでインストールします。
- VSCode上でCtr + Shift + D を押し、デバックウィンドウを開く。
- デバックでは
.NET Core Launch(console)
を選択して実行する。
おわりに
EntityFramworkをVSCodeで簡単に使用することができました。EntityFramworkはC#でDBアクセスするメジャーな方法なのでこれからもう少し見ていこうかと思います。なんとなくただのORマッパーではないことは理解していますが、具体的にまとめていけたらと思います。