今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC Entiry Frameworkを使ったMySQLアクセス

ASP.NET CoreでのMySQLへのアクセスについて
Entiry Frameworkを利用した方法を試してみます。
いわゆるO/Rマッパーで具体的にはDbContextクラスを使って
MySQLからテーブルの内容を読み込んでみます。
動作は、Visual Studio Community 2017 for Mac で行なっています。

データベースの準備

動作確認に必要なテーブルを作成します。
Primary keyの他に名称があるだけの単純なテーブルです。

CREATE TABLE ItemGrp 
(
     id  int NOT NULL AUTO_INCREMENT,
     ItemGrpName  text,
 PRIMARY KEY (id)
)
ENGINE = InnoDB;

Models作成

テーブルに対応するModel「ItemGrp.cs」を作成します。

public partial class ItemGrp
 {
     public int Id { get; set; }
     public string ItemGrpName { get; set; }
 }

DbContext作成

データベースへのアクセスに使用するDbContextクラスを作成します。
今回は、プロジェクトの直下に「DataContext.cs」を作成しました。

public class DataContext : DbContext
{
    public DbSet<ItemGrp> ItemGrp { get; set; }
}

appsettings.jsonの修正

appsettings.jsonMySQL接続文字列を追記します。

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "MySQL": "Database=testdb;Data Source=localhost;User Id=root;Password=パスワード"
  }
}

NuGetでパッケージ追加

Entiry Frameworkを利用するのに必要な
Microsoft.EntityFrameworkCore」と「Pomelo.EntityFrameworkCore.MySql
パッケージを追加します。

Startup.csの修正

Startupクラスに必要な記述を追加します。
まず、appsettings.jsonへ記述したMySQL接続文字列を取得できるように
クラスのコンストラクタを書き換えます。

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

そして、ConfigureServicesメソッドに
DbContextがMySQL接続文字列を使って接続でききるように追加します。

using Microsoft.EntityFrameworkCore;
services.AddDbContext<DataContext>(options =>
    options.UseMySql(Configuration.GetConnectionString("MySQL")));

Controllers作成

ItemGrpController.csを作成してデータベースアクセスに必要なコードを
追加します。

using Microsoft.EntityFrameworkCore;
public class ItemGrpController : Controller
{
    private readonly DataContext _context;
    public ItemGrpController(DataContext context)
    {
        _context = context;
    }

    // GET: /<controller>/
    public async Task<IActionResult> Index()
    {
        return View(await _context.ItemGrp.ToListAsync());
    }
}

MySQLのテーブルからデータを取得するのにこんな簡単なコードで
実現できます。
ItemGrpControllerのコンストラクタでDbContextオブジェクトがそのまま渡されます。
最終的には_context.ItemGrpを使ってテーブルのItemGrpへアクセスします。
そしてテーブル内のデータをリスト化するために
ToListAsyncメソッドを呼び出します。
リスト化されたデータはViewメソッドを使ってIndexページに渡されます。

Viewを作成

一覧を表示する Index.cshtml を作成します。

@model IEnumerable<MasterTest.Models.ItemGrp>

<h2>index</h2>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ItemGrpName)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(model => item.Id)
            </td>
            <td>
                @Html.DisplayFor(model => item.ItemGrpName)
            </td>
        </tr>
}
    </tbody>
</table>

思ったよりも簡単に実現することができました。
簡単なマスタ画面だったら工数をかけずにサクッとできそうです。
ただ、実際にシステムはこんなに単純ではなく
一度の処理でいろんなテーブルを読み書きしなければなりませんので
そんな場合はどのようにするのか?今後の課題となります。

かっこいいApple小物のご紹介

Apple Watch 充電 スタンドです。
Apple Watchをセットすると、ちょうどディプレイのようになるカッコよさ。
形状が90年代のMacintoshなのがとても嬉しいです!