Entity Framework Coreのモデルとテーブルの作成 (SQLiteを使用) - C#

Entity Frameworkのモデルを作成し、モデルからテーブルを作成する手順を紹介します。

プログラム

データベースにSQLiteを利用する場合のプログラムです。
メモ
データベースにSQL Serverを利用する場合の手順はこちらの記事を参照してください。

事前準備:Entity Framework Coreのインストール

Entity Framework CoreとEntity Framework Core SQLite をインストールします。詳細な手順はこちらの記事を参照してください。

UI

下図のフォームを作成します。テキストボックスとボタンを3つ配置します。

コード

モデルクラスを作成します。
MyRec.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleEntityFrameworkCoreSqlite
{
  public class MyRec
  {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public int Price { get; set; }
  }
}

DbContextを継承したコンテキストクラスを作成します。
MyContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Sqlite;

namespace SimpleEntityFrameworkCoreSqlite
{
  public class MyContext : DbContext
  {
    public DbSet<MyRec> Rec { get; set; }
    public string DbPath { get; }

    public MyContext()
    {
      DbPath = @"C:\storage\data\mydata.db";
    }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
      options.UseSqlite("Data Source=" + DbPath);
    }
  }
}

フォームのボタンのイベントを実装します。
FormMain.cs
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;

namespace SimpleEntityFrameworkCoreSqlite
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();
      RelationalDatabaseCreator rdc = (RelationalDatabaseCreator)mc.Database.GetService<IDatabaseCreator>();
      rdc.CreateTables();

      textBox1.Text += "テーブルを作成しました。\r\n";
    }

    private void button2_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();

      mc = new MyContext();

      MyRec mr = new MyRec();
      mr.Name = "ぺんぎんクッキー";
      mr.Category = "焼き菓子";
      mr.Price = 240;
      mc.Add(mr);

      mr = new MyRec();
      mr.Name = "らくだキャラメル";
      mr.Category = "生菓子";
      mr.Price = 85;
      mc.Add(mr);

      mr = new MyRec();
      mr.Name = "しろくまアイス";
      mr.Category = "氷菓";
      mr.Price = 320;
      mc.Add(mr);


      mc.SaveChanges();
      textBox1.Text += "レコードを挿入しました。\r\n";
    }

    private void button3_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();
      IEnumerable<MyRec> result = mc.Rec;

      foreach (MyRec m in result) {
        textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.ID, m.Name, m.Category, m.Price);
      }
    }
  }
}

解説

MyRecクラスはデータベースのテーブルのカラムの構造と合わせた構造を定義します。メンバはプロパティで宣言します。
  public class MyRec
  {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public int Price { get; set; }
  }

DbContextクラスを継承した MyContext クラスを実装します。DbPathプロパティにデータベースのファイルパスを設定します。 OnConfiguringメソッドをオーバーライドし、メソッド内で、UseSqlite メソッドを呼び出し、SQLiteデータベースを設定します。
  public class MyContext : DbContext
  {
    public DbSet<MyRec> Rec { get; set; }
    public string DbPath { get; }

    public MyContext()
    {
      DbPath = @"C:\storage\data\mydata.db";
    }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
      options.UseSqlite("Data Source=" + DbPath);
    }
  }

[button1]はデータベースとテーブルを作成するコードです。
MyContext オブジェクトを取得し、MyContextオブジェクトのDatabase.GetService()メソッドを呼び出し、RelationalDatabaseCreator オブジェクトを取得します。 RelationalDatabaseCreator オブジェクトの CreateTablesメソッドを呼び出してテーブルを作成します。
    private void button1_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();
      RelationalDatabaseCreator rdc = (RelationalDatabaseCreator)mc.Database.GetService<IDatabaseCreator>();
      rdc.CreateTables();

      textBox1.Text += "テーブルを作成しました。\r\n";
    }

テーブルにレコードを挿入します。
MyContext オブジェクトを取得し、MyContext オブジェクトのAddメソッドを呼び出しレコードを挿入します。 Addメソッドの引数に、レコードオブジェクトのMyRec オブジェクトに値を設定したものを与えます。
レコードの挿入後、SaveChangesメソッドをよびっだし変更をデータベースに反映します。
    private void button2_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();

      MyRec mr = new MyRec();
      mr.Name = "ぺんぎんクッキー";
      mr.Category = "焼き菓子";
      mr.Price = 240;
      mc.Add(mr);

      mr = new MyRec();
      mr.Name = "らくだキャラメル";
      mr.Category = "生菓子";
      mr.Price = 85;
      mc.Add(mr);

      mr = new MyRec();
      mr.Name = "しろくまアイス";
      mr.Category = "氷菓";
      mr.Price = 320;
      mc.Add(mr);

      mc.SaveChanges();
      textBox1.Text += "レコードを挿入しました。\r\n";
    }

テーブルに挿入したレコードを取得し、テキストボックスに値を表示します。
MyContextオブジェクトを取得します。Recプロパティにレコードの一覧が設定されています。IEnumerable<MyRec> オブジェクトでRecプロパティの値を代入し、 foreach文でループし、テキストボックスにレコードの値を表示します。
    private void button3_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();
      IEnumerable<MyRec> result = mc.Rec;

      foreach (MyRec m in result) {
        textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.ID, m.Name, m.Category, m.Price);
      }
    }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Create Table]ボタン(button1)をクリックします。"テーブルを作成しました。"のメッセージがテキストボックスに表示されます。


テーブルが作成されると、データベースのファイルパスに設定した C:\Storage\data\mydata.db ファイルが作成されていることを確認できます。


続いて[Insert Records]ボタン(button2)をクリックします。"レコードを挿入しました。"のメッセージが表示されます。


[Select All]ボタン(button3)をクリックします。データベースからレコードを取得し、レコードの値がテキストボックスに表示されます。
挿入したレコードの値がデータベースに格納でき、データベースからレコードのデータを取得できている動作が確認できます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-11-26
作成日: 2022-11-23
iPentec all rights reserverd.