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
- https://docs.microsoft.com/en-us/ef/core/index
- http://www.learnentityframeworkcore.com/
- http://ryuichi111std.hatenablog.com/entry/2016/11/08/023809
- http://gooner.hateblo.jp/entry/2016/03/04/071400
- https://blogs.msdn.microsoft.com/nakama/2016/07/07/aspnetcore10-part2/
- http://ohke.hateblo.jp/entry/2017/03/03/000000