MacでASP.NET5 MVC6 (DB(sqlite)連携してみる）


dnxというか、asp.net mvc6というか、EntiryFrameworkのバージョンがbeta6になり、sqliteがまともに使えるようになったので、asp.net5 mvc6環境で動かしてみます。

なお、ベースとしては、sqlite活用サンプルを利用します。

環境設定や、そもそものsqliteとの連携については、すみませんが過去記事

* [MacでASP.NET](http://qiita.com/zaburo/items/86c21a1b86f526813802)
* [MacでASP.NET5 MVC6（ちょっといじってみる編）](http://qiita.com/zaburo/items/f1fcfab0c0f699cd58cd)
* [MacでEntityFramework7(beta6)経由でsqliteを使う](http://qiita.com/zaburo/items/45d47a36ec54de2b2835)

を見て下さい。

##進める

###ひな形ファイルを作る

ここではyeomenを使います。

```bash
yo aspnet
```

ここではWeb Application Basic [without Membership and Authorization]を選びます。普通のWeb Applicationでもいいですが、Modelsとか、Migrationsとかがごちゃつくので、Basicにします。

```bash
     _-----_
    |       |    .--------------------------.
    |--(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の抜粋

```js
{
  "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を実行し、必要ライブラリを読み込みます。

```bash
dnu restore
```

問題がなければ、とりあえずの準備は完了です。

###とりえず実行してみる

とりあえず、標準のWeb画面が表示されるか見てみます。

```bash
dnx . kestrel
```
kestrelというWebサーバを立ちあげ、StartedとなればOKです。
http://localhost:5000/ にアクセスしてみます。ページが表示されればOKです。

また、

```bash
dnx . ef
```
を実行し、EntiryFrameworkのコマンド画面が表示されるかも確認します。

###Modelの追加

プロジェクトの1階層目にModelsフォルダを作成し、その中にModel.csを作成します。
過去記事のサンプルコードを利用している人は、Namespaceにだけ気をつけて下さい。

```csharp
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; }
    }
}
```

ここで一度、ビルドしておきます。

```bash
dnu build --quiet
```

WarningやErrorが表示されない(0)ことを確認します。

###Migrationファイルの生成

Model.csの情報を元に、efコマンドを利用して、DB生成用のMigrationファイルを生成します。

```bash
dnx . ef migration add MyFirstMigration
```

Migrationsフォルダが生成され、その中にマイグレーション関連ファイルが生成されます。

###Migrationの実行

DBを生成するためにマイグレーションを実行します。が、そのままだとエラーが出るので、マイグレーションファイル(xxxxxx_MyFirstMigration.cs)を編集します。

BlogIdとPostIdを制御するコード行から、.Annotation()を削除します。

```csharp
BlogId = table.Column(type: "INTEGER", nullable: false)
                        .Annotation("Sqlite:Autoincrement", true),
```
を、

```csharp
BlogId = table.Column(type: "INTEGER", nullable: false),
```
というようにします。PostIdの方も同様に対応します。
編集が完了したらMigrationを実行します。

```bash
dnx . ef migration apply
```

Done.となればとりあえずOKです。

プロジェクトフォルダにblog.dbファイルができるので、sqliteコンソールから、サンプルとなるデータを幾つか挿入しておきます。他のメソッドは割愛。
折角なのでLinqを使ってみます。全件を取得して、Viewに渡しています。

###Controllerでデータを取得してみる

今回ははじめから存在するHomeController.csにList()メソッドを追加して対応します。
以下は、List()だけの抜粋です。折角なのでLinqを使ってみました。

```csharp
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を作成し、以下のコードを記述します。

```html
@model IEnumerable<WebApp.Models.Blog>
<h3>List</h3>
@foreach(var item in Model)
{
	@item.BlogId @item.Url<br>
}
```
表示できました。
![aspnetsqlite](http://www.bluecode.jp/qiita/aspnetsqlite002.png)
DBがsqliteなので、本格的なサービスには向きませんが、MySQLのプロバイダが出てくればかなり期待できそうです。