血糖値管理をWebアプリにする③ 理解のまとめ3

プログラミング

今回は、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歳という年齢相応の老化をしていると思います。
腰痛になったとき、今まで難なくできていたことが、突然できなくなりました。
老化が進むとそうなるのだと、思いました。
とはいえ、老化を恐れているわけではありません。
いずれできなくなることが増えていくとは思いますが、今、できることをやるだけです。
プログラミングに関連していうと、今、こんなに楽しく、ワクワクして取り組めることに、感謝、です。


タイトルとURLをコピーしました