プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/01/10

Entity Framework Core の基本的な使い方

update2018/01/30 event_note2018/01/10 0:29

Entity Framework Core の基本的な使い方についてです。

基本的には公式のドキュメントが充実しているので、それを参考に自分なりにまとめただけです。

追記

現在では他にも調べたことを以下にまとめていっているので、そちらのほうが参考になるかもしれません。

環境

  • Visual Studio 2017
  • .NET Core 2.0
  • Entity Framework Core 2.0

Entity Framework Core のインストール

NuGet でデータベースプロバイダーに応じたパッケージをインストールします。

例えば、SQL Server を使用する場合は

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer

SQLite を使用する場合は

PM> Install-Package Microsoft.EntityFrameworkCore.Sqlite

です。
詳細は以下を参照してください。

モデルの作成

最初にテーブルレコードとマッピングされるエンティティクラスを作成します。
ここでは例として、以下のようなエンティティクラスを作成します。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

これがテーブルの構造になります。

この Person クラスをデータベースに出し入れするため、DbContext クラスを継承したコンテキストクラスを定義します。

using Microsoft.EntityFrameworkCore;

// 中略

public class PersonDbContext : DbContext
{
    public DbSet<Person> Persons { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // データベースプロバイダーに応じた設定
    }
}

OnConfiguring() メソッドの中ではデータベースへの接続文字列などを設定しますが、プロバイダーに応じて設定が異なるので、ここでは省略します。

Entity Framework Core で使用可能なプロバイダーについては以下を参照してください。

データベースとのマッピング方法を指定する

文字列のサイズや NOT NULL 制約など、データベースとの O/R マッピングの方法を指定します。

マッピング方法の指定には属性を使って指定する Data Annotation 方式と、OnModelCreating() メソッド内にコードで記述する Fluent API 方式があるようです。

例えば、前述の Person クラスで Name プロパティを必須にしたい場合は以下のように記述します。

Data Annotation

public class Person
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

Fluent API

public class PersonDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().Property(x => x.Name).IsRequired();
        base.OnModelCreating(modelBuilder);
    }
}

個人的に Data Annotation 方式のほうがわかりやすくて好きですが、複合キーやリレーションシップなどに関する情報は現時点ではFluent API 方式でしか設定できないようです。

主キー

Entity Framework Core では id Id <entity name>ID などのプロパティが存在した場合、これが主キーであると自動的に判断されるようです。
Data Annotation で [key] で明示的に指定する方法もあります。

Code First によるデータベースの作成

EnsureCreated() メソッドを実行すると、モデルを元にデータベースが作成されます。

// データベースの作成
using (var db = new PersonDbContext())
{
    await db.Database.EnsureCreatedAsync();
}

既にデータベースが存在する場合は何も実行されないようです。
その場合、データベースとモデルの整合性はチェックされないようなので、注意が必要です。

CRUD 操作

基本的な CRUD 操作の方法です。

レコードの追加

using (var db = new PersonDbContext())
{
    var person = new Person { Name = "Hoge" };
    db.Persons.Add(person);
    db.SaveChanges();
}

レコードの取得

using (var db = new PersonDbContext())
{
    foreach (var person in db.Persons)
    {
        Console.WriteLine($"ID={person.Id}, Name={person.Name}");
    }
}

レコードの更新

int id = 1;
using (var db = new PersonDbContext())
{
    var person = db.Persons.Where(x => x.Id == id).FirstOrDefault();
    person.Name = name;
    db.SaveChanges();
}

レコードの削除

int id = 1;
using (var db = new PersonDbContext())
{
    var person = db.Persons.Where(x => x.Id == id).FirstOrDefault();
    db.Persons.Remove(person);
    db.SaveChanges();
}

参考 URL