Entity Framework Core でテーブルを作成する - C#

Entity Framework Core でテーブルを作成するコードを紹介します。

概要

Entity Framework Core でデータベースをドロップする場合には、コンテキストオブジェクトのDatabaseプロパティから、RelationalDatabaseCreatorオブジェクトを取得し、 RelationalDatabaseCreatorオブジェクトの CreateTables() メソッドを呼び出します。

プログラム1: SQL Serverの例

事前準備

データベースを作成します。データベースにテーブルが無いことを確認します。

UI

下図のフォームを作成します。ボタンが複数配置されていますが、今回のデモで使用するボタンは[Create Table](button1)です。

コード

下記コードを記述します。
MyDbContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;

namespace EntityFrameworkCoreCreateTableSqlServer
{
  public class MyDbContext : DbContext
  {
    public DbSet<MyTable1Rec> MyTable1 { get; set; }
    public DbSet<MyTable2Rec> MyTable2 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
      options.UseSqlServer("Data Source=(DBホスト名またはIPアドレス);Initial Catalog=iPentecSandBox3;User ID=(ユーザーID);Password=(パスワード);Encrypt=False");
    }
  }
}
MyTable1Rec.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EntityFrameworkCoreCreateTableSqlServer
{
  public class MyTable1Rec
  {
    public int id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public string Code { get; set; }
    public int Price { get; set; }
  }
}
MyTable2Rec.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EntityFrameworkCoreCreateTableSqlServer
{
  public class MyTable2Rec
  {
    [Key]
    public int id { get; set; }
    public int ProductId { get; set; }
    public int Stock { get; set; }
  }
}

フォームのコードです。
FormMainc.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;

namespace EntityFrameworkCoreCreateTableSqlServer
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

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

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

解説

MyTable1Rec.cs, MyTable2Rec.cs はテーブル構造のクラスになります。
MyDbContext.csはDbContextクラスを継承したクラスで、テーブルのオブジェクトDbSetを2つ定義しています。また、OnConfiguring メソッドで、UseSqlServerを呼び出し、 接続文字列に設定されているSQL Serverのデータベースに接続します。
  public class MyDbContext : DbContext
  {
    public DbSet<MyTable1Rec> MyTable1 { get; set; }
    public DbSet<MyTable2Rec> MyTable2 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
      options.UseSqlServer("Data Source=(DBホスト名またはIPアドレス);Initial Catalog=iPentecSandBox3;User ID=(ユーザーID);Password=(パスワード);Encrypt=False");
    }
  }

フォームのボタンクリックで以下のコードを実行します。RelationalDatabaseCreator オブジェクトを取得し、CreateTables() メソッドを呼び出しテーブルを作成します。
今回のプログラムでは、MyDbContextにMyTable1, MyTable2 プロパティが宣言されていますので、データベースには、MyTable1, MyTable2 の2つのテーブルが作成されます。
    private void button1_Click(object sender, EventArgs e)
    {
      MyDbContext mc = new MyDbContext();
      RelationalDatabaseCreator rdc = (RelationalDatabaseCreator)mc.Database.GetService<IDatabaseCreator>();
      rdc.CreateTables();

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

実行結果

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


[Create Table]ボタンをクリックします。テーブルが作成された旨のメッセージが表示されます。


データベースサーバーでデータベースにテーブルが作成されたかを確認します。MyTable1とMyTable2が作成されており、テーブルが作成できていることが確認できます。

プログラム2: SQLiteの例

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。ボタンが複数配置されていますが、今回のデモで使用するボタンは[Create Table](button1)と[Record Count](button6)を使用します。

コード

以下のコードを記述します。
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);
    }
  }
}
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; }
  }
}
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 button6_Click(object sender, EventArgs e)
    {
      MyContext mc = new MyContext();
      int cnt = mc.Rec.Count<MyRec>();
      textBox1.Text += string.Format("{0:d}\r\n",cnt);

    }
  }
}

解説

button1

button1はテーブルを作成するコードです。

データベースコンテキストオブジェクトを作成します。
  MyContext mc = new MyContext();

データベースコンテキストオブジェクトのDatabase プロパティの GetService メソッドを呼び出し、RelationalDatabaseCreator オブジェクトを取得します。
  RelationalDatabaseCreator rdc = (RelationalDatabaseCreator)mc.Database.GetService<IDatabaseCreator>();

RelationalDatabaseCreator オブジェクトの CreateTables メソッドを呼び出します。
データベースコンテキストクラスに定義されているテーブルがデータベースに作成されます。
  rdc.CreateTables();

button6

button6はRecテーブルのレコードの個数を取得するコードです。レコードの個数を取得しテキストボックスに個数を表示します。
  MyContext mc = new MyContext();
  int cnt = mc.Rec.Count<MyRec>();
  textBox1.Text += string.Format("{0:d}\r\n",cnt);

実行結果

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


[Create Table]ボタンをクリックします。テーブルが作成された旨のメッセージが表示されます。


[Recrod Count]ボタンをクリックします。テーブルが作成され、レコードが無いため、"0"がテキストボックスに表示されます。


なお、テーブルを作成せずに、[Record Count]ボタンをクリックすると、Microsoft.Data.Sqlite.SqliteException 例外が発生し、 SQLite Error 1: 'no such table: Rec'.となります。[Create Table]ボタンでテーブルが作成されたことが確認できます。


Entity Framework Core でテーブルが作成できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-05-08
作成日: 2022-11-25
iPentec all rights reserverd.