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.jsonへMySQL接続文字列を追記します。{ "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なのがとても嬉しいです!