前回、ASP.NET Coreをubuntuで動かせたので、今回はDBアクセスしてみます。

DBMSにはいろいろ選択肢がありますが、Entity Framework Coreのサポートが充実してるPostgreSQLを選びました。

本命はSQL Server on Linuxなんですが、

You need at least 3.25GB of memory to run SQL Server on Linux. For other system requirements

なんで、却下。

PostgreSQLインストール

1
2
vagrant@vagrant:~$ sudo apt-get update
vagrant@vagrant:~$ sudo apt-get install postgresql postgresql-contrib

dbユーザーとDB作成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
vagrant@vagrant:~$ psql
psql: FATAL:  role "vagrant" does not exist
vagrant@vagrant:~$ sudo -i -u postgres
postgres@vagrant:~$ createuser vagrant
postgres@vagrant:~$ createdb aspnetdb -O vagrant       #本番用
postgres@vagrant:~$ createdb aspnetdb_dev -O vagrant   #開発用
postgres@vagrant:~$ psql -l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 aspnetdb     | vagrant  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 aspnetdb_dev | vagrant  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
(5 rows)

ホストOS(Windows)から接続

Postgresに外部から接続可能にしとく。

guestからhostは10.0.2.* に見えるらしい。

1
2
3
4
5
6
7
8
vagrant@vagrant:~$ sudo nano /etc/postgresql/9.5/main/postgresql.conf
#追記します
listen_addresses = '*'
vagrant@vagrant:~$ sudo nano /etc/postgresql/9.5/main/pg_hba.conf
#追記します
host    all             vagrant         10.0.2.1/24             trust

vagrant@vagrant:~$ sudo systemctl restart postgresql

Vagrantfileにポートマッピング追記

1
2
config.vm.network "forwarded_port", guest: 5432, host: 5432
# $>vagrant reload

windowsから接続テスト

pgAdminをインストールします。pgadmin4-1.5-x86.exe

サーバ追加で

Host: localhost

port: 5432

database: aspnetdb_dev

username: vagrant

で追加

ちゃんとつながればOK。

Entity Framework coreでコードファースト

VS2017のPackage Manager Consoleで

1
2
PM> Install-Package Npgsql.EntityFrameworkCore.PostgreSQL
PM> Install-Package Microsoft.EntityFrameworkCore.Tools -Version 1.1.1

適当なサンプルとしてこちらのBloggingContextをコピってきます。

接続設定

サンプルのコンテキストクラスをpostgres向けに変更します。

1
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");

1
optionsBuilder.UseNpgsql(@"Host=localhost;Database=aspnetdb_dev;Username=vagrant");

に変更する。

DB migration

Enable-Migrationは要らないみたいです。

1
2
3
PM> Add-Migration InitialCreate
PM> Update-Database
DDL系のSQLが出力されます。

pgAdminでテーブルができてればOK。

データ更新サンプル

気の利いたもの作るのも面倒なので、AboutにアクセスでInsert、Homeでリスト表示するようなのにします。

HomeControllerのIndexとAboutを

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public IActionResult Index()
        {
            using (var db = new Models.BloggingContext()){
                var blogs = db.Blogs.OrderBy(b => b.Url).ToList();
                return View(blogs);
            }
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";
            using (var db = new Models.BloggingContext()){
                var blog = new Models.Blog { Url = "http://sample.com/"+DateTime.UtcNow.ToString("yyyyMMdd_hhmmssms") };
                db.Blogs.Add(blog);
                db.SaveChanges();
            }
            return View();
        }

にします。

index.cshtmlの先頭部分を

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@model List<WebApplication3.Models.Blog>
@{
    ViewData["Title"] = "Home Page";
}

<ol>
    @foreach (var blog in Model)
    {
        <li >@(blog.Url)</li>
    }
</ol>

こんな感じにします。

Aboutに何度かアクセスした後Indexにリストが出てればOK。

ついでにpgAdminでデータを見てみるとちゃんとできてます。

Windows上のasp.net mvcからubuntuのpostgresを使えたんですが、asp.net mvcをubuntuで動かすにはまだいろいろやらねばならなさそうです。

長いんで、次回に続く予定