ASP.NET Core で SQLite のデーターベースを生成する

## 新規プロジェクトの作成

- **[dotnet new コマンド](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?tabs=netcore21)**で新しいプロジェクトを作成します。

```sh
dotnet new web -o CreateDbSample
cd CreateDbSample
```
___

## SQLite パッケージの追加

- ASP.NET で SQLite を扱うためのパッケージをインストールします。

```sh
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
``` 

___

## モデルの作成

- 今回は商品モデルを作成します。
- モデルはデータベースのレコード当たります。
- プロジェクトルートに`Models`フォルダを作成し、`Models`フォルダ内に`Product.cs`を作成します。

```cs:./Models/Product.cs
namespace CreateDbSample.Models
{
    public class Product
    {
        // ID は自動で主キー
        public int ID { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
    }
}
```

___

## データベースコンテキストの作成

- `Models`フォルダ内に`ShopDbContext.cs`を作成します。
- このコンテキストを通して DB にアクセスします。
- `DbSet<Product>`がテーブルのイメージです。

```cs:./Models/ShopDbContext.cs
using Microsoft.EntityFrameworkCore;

namespace CreateDbSample.Models
{
    public class ShopDbContext : DbContext
    {
        public ShopDbContext(DbContextOptions options)
            : base(options) { }

        public DbSet<Product> Products { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
            optionsBuilder.UseSqlite("Data Source=shop.db");
    }
}
```

___

## `Startup.cs`の編集

- データベースコンテキストを DI コンテナーに登録します。
- 後で Web API で動確するために`AddMvc` `UseMVC`を設定します。

```cs:
using CreateDbSample.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace CreateDbSample
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<ShopDbContext>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();
            app.UseMvc();
            app.Run(async (context) => await context.Response.WriteAsync("Hello World!"));
        }
    }
}
```

___

## データベースの生成

- データベースの設計図となるマイグレーションファイルをスキャフォールディングします。

```sh
dotnet ef migrations add Initial
```

- `Migrations`が追加され、その中に`<timestamp>_initial.cs`が追加されます。

```cs:
using Microsoft.EntityFrameworkCore.Migrations;

namespace CreateDbSample.Migrations
{
    public partial class Initial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Products",
                columns: table => new
                {
                    ID = table.Column<int>(nullable: false)
                        .Annotation("Sqlite:Autoincrement", true),
                    Name = table.Column<string>(nullable: true),
                    Price = table.Column<int>(nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Products", x => x.ID);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Products");
        }
    }
}
```

___

- データベースを生成するため、以下のコマンドを入力します。

```sh
dotnet ef database update
```

プロジェクトのルートフォルダに`shop.db`が追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/b2be897b-9ea8-216d-abdc-615fca050504.png)

___

## Web API で動作確認

- `Controllers/productsController.cs`を作成します。
- 商品追加と商品一覧取得のメソッドを持ちます。

```cs:
using CreateDbSample.Models;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;

namespace CreateDbSample.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ProductsController : ControllerBase
    {
        ShopDbContext Context { get; set; }
        public ProductsController(ShopDbContext context)
        {
            Context = context;
        }

        [HttpPost]
        public Product AddProduct(Product product)
        {
            Context.Products.Add(product);
            Context.SaveChanges();
            return product;
        }

        [HttpGet]
        public IEnumerable<Product> GetProducts() => Context.Products.ToList();
    }
}
```

___

`dotnet run`してサーバーを立ち上げます。
POSTMAN で動作確認します。

- **追加**
![addproduct.PNG](https://qiita-image-store.s3.amazonaws.com/0/195024/06b99fa9-276b-5f5f-0d09-80ab480cbbd9.png)
![addproduct.PNG](https://qiita-image-store.s3.amazonaws.com/0/195024/f745fdf9-3b6c-20a0-8244-3f6979845eb8.png)

- **一覧取得**
![getproducts.PNG](https://qiita-image-store.s3.amazonaws.com/0/195024/01f6ed22-c986-dc35-e18b-a6e656d60154.png)

SQLite のデータベースが動いていることが確認できました！