前回、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で動かすにはまだいろいろやらねばならなさそうです。
長いんで、次回に続く予定。