はじめに
この記事では、ASP.NET Core な Web アプリケーションの Entity Framework Core のコードから、PostgreSQL にデータベースとテーブルを作成して、実際に Web アプリケーションを動作させてみます。
なお、環境は Mac (macOS High Sierra 10.13.3) で .NET Core SDK 2.1.4、PostgreSQL 10.3 、Visual Studio Code になります。とはいえ、Windows でも同じように作成できると思います。
新規プロジェクトの作成と準備
まずは ASP.NET MVC Core の新規プロジェクトを以下のコマンドで作成します。ここで、プロジェクト名は MyProj としていますので、適宜読み替えてください。
$ dotnet new mvc -o MyProj
プロジェクトが作成されたら、プロジェクトのルートディレクトリ(.csprojのあるディレクトリ)に移動して、2つのパッケージを Nuget からインストールします。
$ cd MyProj
$ dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet
$ dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
現時点では、これだけでは設定が足りないので Microsoft.EntityFrameworkCore.Tools.DotNet の設定を MyProj.csproj に追加します。
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.1" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" /> </ItemGroup> <!--ここを追記--> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup> </Project>
下記コマンドで設定を反映します。
$ dotnet restore
PostgreSQL へ接続するための設定
PostgreSQL に接続しデータベースとテーブルを作成するために、以下の設定を行います。
・Models/Book.cs の作成
using System; namespace MyProj.Models { public class Book { public int Id { get; set; } public string Title { get; set; } public int Price { get; set; } } }
・Models/MyContext.cs の作成
using System; using Microsoft.EntityFrameworkCore; namespace MyProj.Models { public class MyContext : DbContext { public MyContext(DbContextOptions options) : base(options) { } public DbSet<Book> Book { get; set; } } }
・appsettings.json の設定
以下の設定を追加します。
"ConnectionStrings": { "MyContext": "Server=localhost;Database=myproj;Username=username;Password=password;" }
・Startup.cs の設定
以下の using を追加します。
using Microsoft.EntityFrameworkCore; using Npgsql.EntityFrameworkCore.PostgreSQL; using MyProj.Models;
ConfigureServices に設定を追加します。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); // コンテキストクラスを登録 services.AddDbContext<MyContext>(options => options.UseNpgsql( Configuration.GetConnectionString("MyContext") )); }
PostgreSQL データベースの作成
プロジェクトのルートディレクトリで、以下のコマンドを実行します。MyProj は重複しなければどんな名前でもよいようです。
$ dotnet ef migrations add MyProj $ dotnet ef database update
すると、以下のようにデータベースとテーブルが正しく追加されていることが分かります。
Web アプリにデータベースの内容を表示する
まず、Book テーブルにデータを追加します。
それから、ビューにデータを表示するための設定を行います。
・Controllers/HelloController.cs を作成
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MyProj.Models; namespace MyProj.Controllers { public class HelloController : Controller { private readonly MyContext _context; public HelloController(MyContext context){ this._context = context; } public IActionResult List() { return View(this._context.Book); } } }
・Views/Hello/List.cshtml を作成
@model IEnumerable<MyProj.Models.Book> @{ ViewData["Title"] = "List"; } <h2>List</h2> <table> <tr> <td>書名</td> <td>価格</td> </tr> @foreach(var item in Model) { <tr> <td>@item.Title</td> <td>@item.Price</td> </tr> } </table>
では、下記コマンドで Web アプリケーションを起動します。
$ dotnet run
ブラウザでアクセスすると、問題なく表示されますね。
おわりに
MySQL で同じことを行ったのですが、PostgreSQL でも問題なく動作することが分かりました。
コードファーストでは MySQL も PostgreSQL も問題ないようですね。