今回は、DbContextクラスについてです。
DbContextクラスを定義して、データベースのテーブルとモデルクラスをマッピングしたり、テーブル列に対応するプロパティの値を設定します。
DbContextクラスを使用することで、アプリケーション側がモデルクラスのオブジェクトを通じて、テーブルへの検索、更新、登録、削除などの基本的な操作が可能になります。
DbContextクラスは、スキャフォールディングを実行すると、モデルクラスを参照して自動的に/Data/の中に作成されます。
初めに超基本を確認しておきます。
データベースのテーブルとプログラムのオブジェクトは、データ操作をついて、まったく異なる扱いになっています。
データベースではSQLで操作しますし、オブジェクトではメソッドで操作します。
そこで、オブジェクトにテーブルをマッピングして、オブジェクトでテーブル操作ができるようにします。
そのとき、データベースのテーブルをオブジェクトではエンティティ(オブジェクト)と対応づけ、テーブルの列をエンティティ内のプロパティと対応づけます。
では、チュートリアルにでてくるDbContextクラスについて、理解したことをまとめていきましょう。
まず、Student.cs、Enrollment.cs、Course.csの3つのモデルクラスを/Models/の中に作成しておきます。
続いて スキャフォールディング を DbContext名に SchoolContext と指定して実行すると、これらのモデルクラスを参照して、 /Data/ の中に SchoolContext.cs という名でDbContextクラスが自動作成されます。
下記がそのコードです。
using Microsoft.EntityFrameworkCore;
using ContosoUniversity.Models;
namespace ContosoUniversity.Data
{
public class SchoolContext : DbContext
{
public SchoolContext (DbContextOptions<SchoolContext> options)
: base(options)
{
}
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().ToTable(“Course”);
modelBuilder.Entity<Enrollment>().ToTable(“Enrollment”);
modelBuilder.Entity<Student>().ToTable(“Student”);
}
}
}
SchoolContextクラスはDbContextを継承したクラスとして作成されます。
DbContextクラスは、テーブルに対応するモデルクラスのエンティティを通じて、テーブルのレコード操作をできるようにするクラス、程度に理解しておきます。
今は、あまり深入りしないでおきます。
そして、OnModelCreatingメソッドをオーバーライド定義しています。
ここでは、ToTableメソッドで、エンティティとテーブルのマッピングを行っています。
(Course.csのオブジェクト(エンティティ)とCourseテーブルをマッピングなど)
また、OnModelCreatingメソッドの中では、ModelBuilderメソッド(Fluent APIともいいます)を使用して、エンティティのプロパティを変更するコードを記述することもできます。
下記に、主なプロパティの設定を示します。
プロパティ名を指定して、そのプロパティが、下記であることを設定できます。
主キー
外部キー
必須
Unicode文字列
最大長
固定長文字列
バイナリデータ
可変長バイナリデータ
自動生成される値そのプロパティにインデックスが作成される
なお、他で競合するプロパティの値が設定されている場合、ここで設定したプロパティが最優先されます。
次に、データセットのプロパティ定義を見てみましょう。
(この場合の”プロパティ”はテーブルの列のことではなく、クラスのメンバ変数+メソッドのことです。 クラス外部から見るとメンバ変数、クラス内部から見るとメソッドのように振る舞う。)
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
例えば public DbSet<Student> Students { get; set; } と定義することにより
Studentオブジェクトのデータセット(DbSet型)をStudentsとうメンバ変数で参照できるようになります。
言い換えると、Studentテーブル全体のレコードをDbSet型のStudentsとう名前で操作できるようになります。
このように、EntityFramework Coreを使用してデータベースを操作する場合、DbContextクラスがエンティティとテーブルのマッピングの役割を果たしてくれます。
マッピングすることにより、エンティティやプロパティとういわゆるオブジェクト操作で、データベースのテーブルや列の操作ができるようになります。
追記
プログラミングとは、関係のないことですが、老化ということをときどき考えます。
生まれた瞬間から、人は老化が始まるといわれています。
私は、66歳という年齢相応の老化をしていると思います。
腰痛になったとき、今まで難なくできていたことが、突然できなくなりました。
老化が進むとそうなるのだと、思いました。
とはいえ、老化を恐れているわけではありません。
いずれできなくなることが増えていくとは思いますが、今、できることをやるだけです。
プログラミングに関連していうと、今、こんなに楽しく、ワクワクして取り組めることに、感謝、です。