Entity Framework Core でテーブルを作成するコードを紹介します。
概要
Entity Framework Core でデータベースをドロップする場合には、コンテキストオブジェクトのDatabaseプロパティから、RelationalDatabaseCreatorオブジェクトを取得し、
RelationalDatabaseCreatorオブジェクトの CreateTables() メソッドを呼び出します。
プログラム1: SQL Serverの例
事前準備
データベースを作成します。データベースにテーブルが無いことを確認します。
UI
下図のフォームを作成します。ボタンが複数配置されていますが、今回のデモで使用するボタンは[Create Table](button1)です。
コード
下記コードを記述します。
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");
}
}
}
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; }
}
}
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; }
}
}
フォームのコードです。
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)を使用します。
コード
以下のコードを記述します。
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);
}
}
}
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