LoginSignup
0
1

More than 1 year has passed since last update.

Entity Framework Coreを使用してデータベースのマイグレーションを行う

Posted at

Entity Framework Coreとは

.Net coreのデータベース関連を担うパッケージです。
公式には、

  • .NET 開発者が .NET オブジェクトを使用してデータベースを操作できるようにする。
  • 通常記述しなければならないデータアクセス コードの多くを不要にする。

などとあり、データベースの操作を簡単にするパッケージです。

基本的に、このEF Coreを使用すればSQL文を記述せずにデータベースのマイグレーション、データベースへのデータ挿入、取得をコードベース(c#)で行うことができます。

SQL文ベースで使いたいあなたへ

個人的にまだ、SQL文の記述に慣れていないため。できればSQL文を記述し、データベースのマイグレーション、保存、取得を行いたいと考えています。

しかし、Entity Framework Coreはコードベースでデータベース操作できることが大きな機能なので、調査をしても、わざわざSQL文を発行しデータベース操作する情報がなかなか見つかりませんでした。

今回の記事の目的

今回の記事では
SQL文ベースでEntity Framework Coreを使用しどのようにデータベースマイグレーションを行うのか説明します。(とりあえずマイグレーション)

手順

今回は、Mysqlに対して接続する方法を記述します。

1. 以下のパッケージをインストール

//ベースのパッケージ
Microsoft.EntityFrameworkCore

//コマンドを使うためのパッケージ
Microsoft.EntityFrameworkCore.Design

//EF coreを使用しMysqlに接続するためのパッケージ
MySql.EntityFrameworkCore

2. dotnet ef コマンドを使えるか確認

dotnet ef --version

コマンドを打ちコマンドが使えるか確認してください。

3. sqlファイル作成

それでは、sqlファイルをコマンドを打ち作成します。

dotnet ef migrations script -o Migrations/SqlScript.sql
SqlScript

//ここまデフォルト
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
  `MigrationId` varchar(150) NOT NULL,
  `ProductVersion` varchar(32) NOT NULL,
  PRIMARY KEY (`MigrationId`)
);

//↓から個人の追加したテーブルを記述。(ここではusersテーブル)
CREATE TABLE IF NOT EXISTS users(
  id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  public_user_id VARCHAR(36) NOT NULL,
  email VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL,
  name VARCHAR(32) NOT NULL,
  status enum("LEADER", "MEMBER") NOT NULL DEFAULT "MEMBER",
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

4. DbContext周りの設定

プロジェクト内のどこでもいいので、

using Microsoft.EntityFrameworkCore;
namespace yourproject.foldername
{
  public class MyAppContext : DbContext
  {
    public MyAppContext(DbContextOptions<MyAppContext> options) : base(options) { }
  }
}

を作成

5. Startup.csファイル編集

...
    public void ConfigureServices(IServiceCollection services)
    {
      //4で作ったclassを挿入
      services.AddDbContext<MyAppContext>(options =>
      {
     //ここはご自身のmysql情報を挿入してください。(とりあえずベタ書き)
     options.UseMySQL("server=localhost;database=mysql;user=user;password=secret");
      });
      //mysqlの接続かつ1つのインスタンスを作成。
      services.AddSingleton<MysqlDb>();
      services.AddControllers();
    }

6. Migration.csファイルを作成

using Microsoft.EntityFrameworkCore.Migrations;
using System.IO;
using Microsoft.EntityFrameworkCore.Infrastructure;
using teamev.api.infrastructure.db.db_context;
namespace yourproject.foldername
{
  [DbContext(typeof(MyAppContext))]
  [Migration("MigrationClass")]
  public partial class MigrationClass : Migration
  {
    protected override void Up(MigrationBuilder migrationBuilder)
    {
      //3で作成したsqlファイルを指定
      migrationBuilder.Sql(File.ReadAllText("Migration/SqlScript.sql"));

    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
      //説明してませんが、個人でテーブルを削除するなどのDrop.sqlファイルを作成
      migrationBuilder.Sql(File.ReadAllText("Migration/Drop.sql"));
    }
  }
}

7. コマンドを打ちデータベースに反映

以下のコマンドで、6のUpメソッドが発火し、SqlScript.sqlファイル内のsql文が発火します。
マイグレーションしたい場合にこのコマンドを打ってください。

dotnet ef database update

以下のコマンドで、6のDownメソッドが発火します。
作成したテーブルを削除したい場合はこのコマンドを打ってください。

dotnet ef database update 0

8. データベースに反映されているか確認

Mysqlのテーブル内を見て反映されているか確認してください。

最後に

これで、SQL文ファーストでマイグレーションを行うことができました。
.Net core初学者なので理解が甘い部分があると思うので、間違いなどありましたらコメントよろしくお願いします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1