dnxというか、asp.net mvc6というか、EntiryFrameworkのバージョンがbeta6になり、sqliteがまともに使えるようになったので、asp.net5 mvc6環境で動かしてみます。
なお、ベースとしては、sqlite活用サンプルを利用します。
環境設定や、そもそものsqliteとの連携については、すみませんが過去記事
を見て下さい。
進める
ひな形ファイルを作る
ここではyeomenを使います。
yo aspnet
ここではWeb Application Basic [without Membership and Authorization]を選びます。普通のWeb Applicationでもいいですが、Modelsとか、Migrationsとかがごちゃつくので、Basicにします。
_-----_
| | .--------------------------.
|--(o)--| | Welcome to the |
`---------´ | marvellous ASP.NET 5 |
( _´U`_ ) | generator! |
/___A___\ '--------------------------'
| ~ |
__'.___.'__
´ ` |° ´ Y `
? What type of application do you want to create?
Empty Application
Console Application
Web Application
❯ Web Application Basic [without Membership and Authorization]
Web API Application
Nancy ASP.NET Application
Class Library
Webアプリ名を聞いてくるので、ここではWebAppとします。
すると、WebAppというフォルダが作成され、ひな形ファイルが生成されます。
必要なライブラリを読み込む
project.jsonを開き、dependenciesに
- EntityFramework.Sqlite
- EntityFramework.Commands
を追加します。
また、EntiryFramework.Commandsの呼出を簡素化するためにcommandsに、
- "ef": "EntityFramework.Commands"
を追加します。
project.jsonの抜粋
{
"webroot": "wwwroot",
"version": "1.0.0-*",
"dependencies": {
"Microsoft.AspNet.Diagnostics": "1.0.0-beta6",
"Microsoft.AspNet.Mvc": "6.0.0-beta6",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta6",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta6",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-beta6",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta6",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta6",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta6",
"Microsoft.Framework.Configuration.Json": "1.0.0-beta6",
"Microsoft.Framework.Logging": "1.0.0-beta6",
"Microsoft.Framework.Logging.Console": "1.0.0-beta6",
"Kestrel": "1.0.0-beta6",
"EntityFramework.SQLite": "7.0.0-beta6",
"EntityFramework.Commands": "7.0.0-beta6"
},
"commands": {
"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --config hosting.ini",
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --config hosting.ini",
"ef": "EntityFramework.Commands"
},
編集が終われば、dnu restoreを実行し、必要ライブラリを読み込みます。
dnu restore
問題がなければ、とりあえずの準備は完了です。
とりえず実行してみる
とりあえず、標準のWeb画面が表示されるか見てみます。
dnx . kestrel
kestrelというWebサーバを立ちあげ、StartedとなればOKです。
http://localhost:5000/ にアクセスしてみます。ページが表示されればOKです。
また、
dnx . ef
を実行し、EntiryFrameworkのコマンド画面が表示されるかも確認します。
Modelの追加
プロジェクトの1階層目にModelsフォルダを作成し、その中にModel.csを作成します。
過去記事のサンプルコードを利用している人は、Namespaceにだけ気をつけて下さい。
using Microsoft.Data.Entity;
using System.Collections.Generic;
namespace WebApp.Models
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=./blog.db");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
}
ここで一度、ビルドしておきます。
dnu build --quiet
WarningやErrorが表示されない(0)ことを確認します。
Migrationファイルの生成
Model.csの情報を元に、efコマンドを利用して、DB生成用のMigrationファイルを生成します。
dnx . ef migration add MyFirstMigration
Migrationsフォルダが生成され、その中にマイグレーション関連ファイルが生成されます。
Migrationの実行
DBを生成するためにマイグレーションを実行します。が、そのままだとエラーが出るので、マイグレーションファイル(xxxxxx_MyFirstMigration.cs)を編集します。
BlogIdとPostIdを制御するコード行から、.Annotation()を削除します。
BlogId = table.Column(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
を、
BlogId = table.Column(type: "INTEGER", nullable: false),
というようにします。PostIdの方も同様に対応します。
編集が完了したらMigrationを実行します。
dnx . ef migration apply
Done.となればとりあえずOKです。
プロジェクトフォルダにblog.dbファイルができるので、sqliteコンソールから、サンプルとなるデータを幾つか挿入しておきます。他のメソッドは割愛。
折角なのでLinqを使ってみます。全件を取得して、Viewに渡しています。
Controllerでデータを取得してみる
今回ははじめから存在するHomeController.csにList()メソッドを追加して対応します。
以下は、List()だけの抜粋です。折角なのでLinqを使ってみました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using WebApp.Models;
namespace WebApp.Controllers
{
public class HomeController : Controller
{
public IActionResult List()
{
using (var db = new BloggingContext())
{
//linq
var query = from b in db.Blogs
select b;
//return
return View(query);
}
}
}
}
Viewで表示してみる
Views->Homeフォルダの中に、List.cshtmlを作成し、以下のコードを記述します。
@model IEnumerable<WebApp.Models.Blog>
<h3>List</h3>
@foreach(var item in Model)
{
@item.BlogId @item.Url<br>
}
表示できました。
DBがsqliteなので、本格的なサービスには向きませんが、MySQLのプロバイダが出てくればかなり期待できそうです。