Entity Framework 6を使ってコードからデータベースを作ってCRUDできるまで
2019-11-05
azblob://2022/11/11/eyecatch/2019-11-05-try-entityframework-crud-000.jpg

はじめに

最近、初めて業務でEntity Frameworkを触るようになりました。南條です。

Entity Frameworkという名前だけはこれまでも聞いたことがあったのですが、実際に使うことになるのは初めてでした。

周りの先輩のエンジニアの方々には馴染みが深いそうなのですが、新参者の私にはさっぱりです。

とはいっても、そんなさっぱりなままでいるわけにはいかないので自分で学ぶことにしました。

今回の記事では、Entity Frameworkを用いてデータベースを定義し、CRUDができるようになるために自分が書いたコードを解説していきます。

コードについて、もしも改善点等があればアドバイスを頂けると幸いです。

Entity Frameworkでデータベース定義

.Net coreのコンソールアプリケーションとしてプロジェクトを新規作成します。

作成できたら最初に、NuGetパッケージマネージャを開き、「Entity Framework」を検索してインストールしてきます。

インストール時に依存関係にある他のパッケージもインストールされてきます。

完了したら、データベースのスキーマの定義を行っていきます。

Modelという名前でクラスを作成し、以下のようにフィールドを追加していきます。

この中で、IDのフィールドはSQL Server上で自動で割り振られるので、コード上では触れないようにします。

    class Model
    {
        public int ID { get; set; }
        public string Column1 { get; set; }
        public int Column2 { get; set; }
    }

それができたら、次にコード上でデータベースとのセッションを扱うためのContextを作成していきます。

このクラスにはDbContextというものを継承することで、ここで指定したスキーマでデータベースを扱うようにできます。

コードの上では、まるでこのクラスのインスタンスの中にデータベースのデータが入っているように扱えます。

    class Context : DbContext
    {
        public DbSet<Model> Data { get; set; }
    }

Entity FrameworkでCRUD

ここからは、実際にCRUDを行う部分のコードを書いていきます。

Queryという名前のクラスを作成しますが、クラスをインスタンス化しなくても使えるようにするためstaticを付与することを忘れないでください。

また、この中には欠けていないのですが、usingにSystem.Linqを追加してください。

これを使用してWhereなどのデータベースで使用するワードを用いてcontextを操作できるようになります。

static class Query
{
    static public void Create(string data1, int data2)
    {
        using (var context = new Context())
        {
            Console.WriteLine("データを追加しています・・・");
            context.Data.Add(new Model
            {
                Column1 = data1,
                Column2 = data2
            });
            context.SaveChanges();
            Console.WriteLine($"{data1}:{data2}のデータを追加しました!");
        }
    }
    static public List<Model> Read(string data)
    {
        using (var context = new Context())
        {
            var datas = context.Data.Where(d => d.Column1 == data).ToList();
            return datas;
        }
    }
    static public void Update(string data1, int data2)
    {
        using (var context = new Context())
        {
            Console.WriteLine("データベースの値を更新しています・・・");
            var updateDatas = context.Data.Where(d => d.Column1 == data1).ToList();
            updateDatas.ForEach(u => u.Column2 = data2);
            context.SaveChanges();
            Console.WriteLine($"Column1が{data1}のデータを{data1}:{data2}に更新しました!");
        }
    }
    static public void Delete(string data)
    {
        using (var context = new Context())
        {
            Console.WriteLine($"データベースからColumn1の値が{data}のものを削除しています・・・");
            var toRemove = context.Data.Where(d => d.Column1 == data);
            context.Data.RemoveRange(toRemove);
            context.SaveChanges();
            Console.WriteLine("削除しました!");
        }
    }
}

それぞれのメソッドにおいて、Contextクラスをインスタンス化しています。

ここで作成したcontext変数を使うことでデータベース内への検索を行ったり、データの追加、アップデートなどを行うことができます。

そして、CRUDを行うための実際のコードの書き方については、コードを見ていただくのが早いと感じます。

何をするにしても、まずは"context.Data."で始まるメソッドを呼び出して読み出し対象や操作を行う対象を選択し、操作を行う場合は読み出した対象に操作を行ってから"context.SaveChanges()"という操作を行うことで操作結果を確定しています。

実際、Entity Frameworkはこのようにコードとして書かれた操作をSQL文に変換してデータベースに送って操作を行うという振舞いをしているのですが、SQL文の発行を行うタイミングは"context.SaveChanges()"となっています。

なので、CRUDのうちのC,U,Dの操作を行う場合は忘れずにSaveChangesを最後に挟みましょう。

また、Updateの項目においては、私の方法だと抽出したデータをforeach文で回しながら中身を更新しているのですが、foreachを使用しないもっとスマートな書き方があるかもしれません。

教えていただけるとありがたいです。

そして最後に、作成したメソッドを呼び出して動作を確認します。

ここではCreateとReadの操作のみを扱っていますが、コードを書き換えて他の操作も試してみてください。

class Program
{
    static void Main(string[] args)
    {
        using(var context = new Context())
        {
            Query.Create("asd", 1);
            var datas = Query.Read("asd");
            Console.WriteLine("データベースに格納されているデータは:");
            foreach (var data in datas)
            {
                Console.WriteLine($"{data.Column1}:{data.Column2}");
            }
            Console.WriteLine("以上です");
        }
    }
}

ここまでの操作が上手くいっていれば、以下の出力がなされるはずです。

同じコードの実行を繰り返すと、Createが繰り返されて同じ内容がデータベースに追加されていくために"asd:1"の行が次々に増えていくことを確認してみてください。

データを追加しています・・・
asd:1のデータを追加しました!
データベースに格納されているデータは:
asd:1
以上です