仕事でEntityFrameworkを使うかもしれないので、今のところの知識をまとめてみました。
EntityFrameworkとは?
Ruby on RailsにおけるActiveRecord の .NETバージョン。O/Rマッパー。
ActiveRecordに相当するのは、POCOエンティティ(Plain Old CLR Object)という、プロパティだけを持つクラスです。ただ、これはRailsのActiveRecordのように自動生成されずユーザーが自作します。
public class Student
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Age { get; set; }
}
こんな感じのエンティティをModelフォルダ内に作ります。
そしてこのデータをDBから読み込むためにSystem.Data.Entity.DbContextを継承したコンテキストクラスを作ります。
// DbContext を継承する必要がある
public class MyContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Teacher> Teachers { get; set; }
}
プロジェクトをビルドしたタイミングで、コンテキストクラスと同名のデータベースが、そのDB内にPOCOエンティティと同名のテーブルが、自動生成されます。
DBのテーブルにアクセスする際は、このコンテキストクラスのプロパティを使います。
DBからデータを読み込むには↓のようにします。
using (var context = new MyDbContext())
{
var student = context.Students.Find(x => x.Name == "Yuichi"); //Find()のタイミングでクエリ発行
var students = context.Students.Where(x => x.Age <= 20).ToArray(); //ToArray()のタイミグでクエリ発行
//...
}
usingを使っているのは、コンテキストクラスを確実にDisposeするためです。
また、上記2クエリはFindメソッドが実行されるタイミング、ToArrayメソッドが実行されるタイミングでそれぞれ、DBに対してクエリが発行されています。
ですので、クエリが発行されるタイミングを意識して、使用時には不要なDBアクセスを極力抑えるように注意する必要があります。
データの追加、更新、削除は↓のようにやります。
using (var context = new MyDbContext())
{
// 追加
// Addした段階ではSql文はDBに発行されない
context.Students.Add(new Student
{
Name = "Daisuke",
Age = 18
});
//更新
var student = context.Students.Find(x => x.Name == "Yuichi"); //Find()のタイミングでクエリ発行
student.Age = 26;
//削除
var deleteTarget = context.Students.Find(x => x.Name == "Takashi");
context.Students.Remove(deleteTarget);
// SaveChangesが呼び出された段階で初めてInsert,Update,Delete文が発行されます
context.SaveChanges();
}
通常は、更新、削除処理はDBContext経由で読みだした(Find、Whereで読み込んだ)データに対してのみ行なえます。
しかし、例えば削除対象のデータの主キーが予めわかっている場合は、そのデータを事前に読み込むのは冗長な気がします。
そんなときは、Attachメソッドを使います。
using (var context = new MyDbContext())
{
//削除(削除対象のIDが予めわかっている時)
var deleteTarget = new Student { Id = 1 };
context.Students.Attach(deleteTarget);
context.Students.Remove(deleteTarget);
context.SaveChanges();
}
データベースファーストについて
この記事で紹介したのは、まずPOCOエンティティを作って、それに合わせて自動的にDBが作成される、いわゆるコードファーストという手法です。
(EntityFramework自体はこのコードファーストという手法をAsp.NET MVCで実現する為に考案されたものです)
しかし、既にデータベースが存在している場合は、既存のテーブルからPOCOエンティティを作成する必要があります。
これをデータベースファースといいます。
これについては、また記事を分けてまとめていきたいと思います。