16
16

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 3 years have passed since last update.

ASP.NET Core Web API と Entity Framework Core で SQL Server からデータを取得する

Last updated at Posted at 2019-04-04

#はじめに

こういうテーブルから

BookId Title Author
1 たったひとつの冴えたやり方 ジェイムズ・ティプトリー・ジュニア
2 アンドロイドは電気羊の夢を見るか? フィリップ・K・ディック
3 夏への扉 ロバート・A. ハインライン
4 幼年期の終り アーサー C クラーク
5 われはロボット アイザック・アシモフ

こういう JSON を返す API を作る。

[
	{
		"bookId": 1,
		"title": "たったひとつの冴えたやりかた",
		"author": "ジェイムズ・ティプトリー・ジュニア"
	},
	{
		"bookId": 2,
		"title": "アンドロイドは電気羊の夢を見るか?",
		"author": "フィリップ・K・ディック"
	},
	{
		"bookId": 3,
		"title": "夏への扉",
		"author": "ロバート・A. ハインライン"
	},
	{
		"bookId": 4,
		"title": "幼年期の終り",
		"author": "アーサー C クラーク"
	},
	{
		"bookId": 5,
		"title": "われはロボット",
		"author": "アイザック・アシモフ"
	}
]

環境

  • Visual Studio 2019
  • .NET Core 2.2

プロジェクト作成

新しいプロジェクトの作成。
image.png

ASP.NET Core Web アプリケーション。
image.png

プロジェクト名を指定。
image.png

API を選択して作成。
image.png

コーディング

まずはエンティティクラスを作成する。プロジェクト直下に Entities フォルダーを追加。Entities フォルダーに Book クラスを追加。

Entities/Book.cs
namespace SimpleWebApi.Entities
{
    public class Book
    {
        public int BookId { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
    }
}

次にエンティティクラスとテーブルをマッピングするためのコンテキストクラスを作成する。プロジェクト直下に Data フォルダーを追加。Data フォルダーに DbContext クラスを継承した BookContext クラスを追加。

Data/BookContext.cs
using Microsoft.EntityFrameworkCore;
using SimpleWebApi.Entities;

namespace SimpleWebApi.Data
{
    public class BookContext : DbContext
    {
        public BookContext(DbContextOptions options) : base(options)
        {
        }

        public DbSet<Book> Books { get; set; }
    }
}

Controllers フォルダーに BooksController コントローラーを追加。
image.png
image.png

コントローラーにコンストラクターと List メソッドを追加。

Controllers/BooksController.cs
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using SimpleWebApi.Data;
using SimpleWebApi.Entities;

namespace SimpleWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class BooksController : ControllerBase
    {
        private readonly BookContext context;

        public BooksController(BookContext context)
        {
            this.context = context;
        }

        [HttpGet]
        public ActionResult<IEnumerable<Book>> List()
        {
            var books = context.Books;
            return books;
        }
    }
}

Startup.cs にコンテクストクラスをサービスとして登録する。

Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using SimpleWebApi.Data;

namespace SimpleWebApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<BookContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); //追加
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

appsettings.json に接続文字列を追加。

appsettings.json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SimpleWebApiDb;Trusted_Connection=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

データ準備

パッケージマネージャーコンソールで以下のコマンドを実行。(Migrations フォルダーと Migration クラスが作成される)

> Add-Migration Initial

続けて以下のコマンドを実行。(データベースとテーブルが作成される)

> Update-Database

SQL Server でレコード追加クエリ実行。

INSERT INTO Books (Title, Author) VALUES (N'たったひとつの冴えたやりかた',N'ジェイムズ・ティプトリー・ジュニア');
INSERT INTO Books (Title, Author) VALUES (N'アンドロイドは電気羊の夢を見るか?',N'フィリップ・K・ディック');
INSERT INTO Books (Title, Author) VALUES (N'夏への扉',N'ロバート・A. ハインライン');
INSERT INTO Books (Title, Author) VALUES (N'幼年期の終り',N'アーサー C クラーク');
INSERT INTO Books (Title, Author) VALUES (N'われはロボット',N'アイザック・アシモフ');

動作確認

デバッグ実行して /api/books にアクセス。

[
    {
        "bookId": 1,
        "title": "たったひとつの冴えたやりかた",
        "author": "ジェイムズ・ティプトリー・ジュニア"
    },
    {
        "bookId": 2,
        "title": "アンドロイドは電気羊の夢を見るか?",
        "author": "フィリップ・K・ディック"
    },
    {
        "bookId": 3,
        "title": "夏への扉",
        "author": "ロバート・A. ハインライン"
    },
    {
        "bookId": 4,
        "title": "幼年期の終り",
        "author": "アーサー C クラーク"
    },
    {
        "bookId": 5,
        "title": "われはロボット",
        "author": "アイザック・アシモフ"
    }
]

ソースコード

続き

ASP.NET Core Web API で CRUD & Swagger/OpenAPI でテスト

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?