LoginSignup
7
8

More than 3 years have passed since last update.

macOS環境でASP.NET COREのWEBアプリをMySQLに接続した

Posted at

MySQLにデータベース作成

最近ASP.NETでWEBアプリ開発してますが、macOS版の情報無さすぎワロタ。
なのでささやかながらvisual studio for macの情報を共有していきたいと思います。

今回は、ASP.NETとMySQLを接続する方法について書いていきます。

プロジェクトを作成する段階から初めて行こうと思います。

まずvisual studio for macを起動して。
new→Webアプリケーション(MVC)→認証無しと続き、
プロジェクト名は「TestApp」 としておきます。

MySQLにデータベースを作るのが目的ですが、接続した後に確認ができる様にコントローラーとビューをいじっていきます
今回は新しく「TestController」を作ります
Controllersディレクトリ上で右クリックして「追加」→「コントローラークラス」で名前をつけます
e1696e707444bf493f17e0ce5b73dc1e.png

「Views」ディレクトリのなかに「Test」ディレクトリ、その中に「Razorページ」で「Index.cshtml」を作成します。
奈きみはこの様に記述します。c0c4e1b4c501b6ad68909b0db53c932b.png

ここからモデルを操作します。
まずModelsディレクトリで右クリックし、「空のクラス」を作成、名前は「Book」します。
中身を下記の様に記述します。
この記述がカラムとデータ型を指定しています

Models/Book.cs
using System;
namespace TestApp.Models
{
    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int Price { get; set; }
    }
}

次にコンテキストを用意します。
Bookクラスで定義したデータをデータベースに橋渡しするのがコンテキストクラスの役割です。
コンテキストクラスを作成する前にNuGetで必要なパッケージをインストールします

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
MySql.Data
Pomelo.EntityFrameworkCore.MySql

1ab7c7e3a0ab140f61d6bf2cbab76579.png

上記のパッケージをインストールできたら、
Bookクラス同様に空のクラスを作成し、下記の様に記述します。

Models/MyContext.cs
using System;
using Microsoft.EntityFrameworkCore;

namespace TestApp.Models
{
    public class MyContext :DbContext
    {
        public MyContext(DbContextOptions options):base(options)
        {
        }

        public DbSet<Book> Book { get; set; }
    }
}

appsettings.jsonを編集します

appsettings.json
{
  ~中略
  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;userid=username;database=TestApp;"
  }
}

最後にStartup.csを編集します。

Startup.cs
追記
using TestApp.Models;
using Microsoft.EntityFrameworkCore;

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            services.AddDbContext<MyContext>(options =>
                options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
        }

ここまでできたらターミナルに移ります。
作業ディレクトリはTestApp/TestApp、

ターミナル
dotnet ef migrations add TestApp
dotnet ef database update

このコマンドを打ち込めばMySQLにデータベースができているはずです
46d4f960d1c904a5446c94c321918b95.jpg

データベース呼び出し

せっかくなのでMySQLに直接データを打ち込んでデータ呼び出しまでやります。
TestControllerに以下を記述します。

Controllers/TestController.cs
using TestApp.Models;

namespace TestApp.Controllers
{
    public class TestController : Controller
    {
        public readonly MyContext _context;
        public TestController(MyContext context)
        {
            this._context = context;
        }
        public IActionResult Index()
        {
            return View(this._context.Book);
        }
    }
}

コンテキストのインスタンスを宣言し、コンストラクタで自身のフィールドに代入、
データを呼び出したいビューに、引数を入れてあげるという流れです。

ビューの方を記述してあげます。
予めMySQLに直でデータを打ち込んでいます。
呼び出しはforeach文を使って繰り返し表示してあげます。

Views/Test/Index.cshtml
@model IEnumerable<TestApp.Models.Book>

@{
    ViewData["Title"] = "Index";
}

<h1>List</h1>

<table>
    <thead class="table">
        <tr>
            <th>書名</th>
            <th>価格</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.Title</td>
                <td>@item.Price</td>
            </tr>
        }
    </tbody>
</table>

1行目では渡されたモデルに応じて@modelディレクティブでその型を宣言します。
中身はIEnumerable型になっています。
モデルにアクセスするためにはModelを使います。

これで呼び出し完了です。
ローカル環境でここまでの実装を最終確認するために、画面左上の三角マークをクリックしてhttps://localhost:ポートNo/Testでブラウザを開いてください。
1357eb49210583b87d1a4d9b194762f3.png
こんな画面になっていたら実装完了です。

ここまでご覧いただきありがとうございました。
間違っていることがありましたらご指摘お願いします。

ここまで調べるのに手間取ったこと

MySQLと接続するのに「MySQL.Data.EntityFrameworkCore」というパッケージNuGetでインストールして用いる方が結構いらっしゃいました。
私も最初はそちらでやりましたが、うまくいかず「Pomelo.EntityFrameworkCore.MySql」に切り替えまして、そちらでうまくいきました。
英語のStackOverFlowをみてみると「MySQL.Data.EntityFrameworkCore」と「Pomelo.EntityFrameworkCore.MySql」は共存できない様です。

また、多くの方はdotnet efコマンドを使うために「Microsoft.EntityFrameworkCore.Tools.DotNet」というパッケージをインストールしてましたが、前述のパッケージのみでイけました。

7
8
1

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
7
8