4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-30

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>
}

表示できました。
aspnetsqlite
DBがsqliteなので、本格的なサービスには向きませんが、MySQLのプロバイダが出てくればかなり期待できそうです。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?