2019年　EntityFramework を使って　.netcore webapp のＤＢを作る


### 概要
.netcore WebApp を使ったWebサービスのテンプレート作りの一環です。

コードファーストでEntityFramework を使って一からDBをつくる箇所をやる機会がなかったので
チュートリアルを実行しました。


### 環境
Windows10 Pro 1809 
Visual studio 2019 
.NETCore  2.1

参考文献：
https://docs.microsoft.com/ja-jp/ef/core/get-started/aspnetcore/new-db?toc=%2Faspnet%2Fcore%2Ftoc.json&bc=%2Faspnet%2Fcore%2Fbreadcrumb%2Ftoc.json&view=aspnetcore-2.2&tabs=visual-studio


Microsoftの公式チュートリアルを利用します。
Visual Studio 2017 を利用となってますが Visual Studio 2019でも問題ありませんでした。




 ```
> Visual Studio 2017 を開きます 
> [ファイル] > [新規] > [プロジェクト]
> 左側のメニューから [インストール済み] > [Visual C#] > [.NET Core] の順に 選択します。
> [ASP.NET Core Web アプリケーション] を選択します。
> 名前に「EFGetStarted.AspNetCore.NewDb」を入力して [OK] をクリックします。
>[新しい ASP.NET Core Web アプリケーション] ダイアログで次の手順を実行します。
```
 
DBに作る項目は、Model Class を作成します。
Visual Studio では　Modelをフォルダを作成（MVCモデルではすでに作成済み）してそのなかに入れます。

```
Models フォルダーを右クリックし、[追加] > [クラス] の順に選択します。
名前に「Model.cs」を入力して [OK] をクリックします。
このファイルの内容を次のコードに置き換えます。
```

```C# 
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.NewDb.Models
{
    public class BloggingContext : DbContext
    {
        public BloggingContext(DbContextOptions<BloggingContext> options)
            : base(options)
        { }

        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection<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; }
    }
}
```

ASP.NER Core でDBのモデルを使えるようにするにはDI（Dependency injection ）が必要です。
Startup.csから設定がいります。

```C# 
using EFGetStarted.AspNetCore.NewDb.Models;
using Microsoft.EntityFrameworkCore;
```

次の強調表示されたコードが ConfigureServices メソッドに追加されます。


```C# 
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //ここ
    var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<BloggingContext>
        (options => options.UseSqlServer(connection));

    // BloggingContext requires
    // using EFGetStarted.AspNetCore.NewDb.Models;
    // UseSqlServer requires
    // using Microsoft.EntityFrameworkCore;
}
```

EntityFramework の　CodeFirstで作った場合
Visual Studio のパッケージマネージャーコンソールで　DBの反映をします

```
Add-Migration InitialCreate
```

参照：https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/
これで、DBを作成するファイルが作成されます。

``` 

XXXXXXXXXXXXXX_InitialCreate.cs--メインの移行ファイル。 (Up() で) 移行を適用し、(Down() で) それを元に戻すために必要な操作が含まれます。
XXXXXXXXXXXXXX_InitialCreate.Designer.cs--移行メタデータ ファイル。 EF によって使用される情報が含まれます。
MyContextModelSnapshot.cs--現在のモデルのスナップショット。 次の移行を追加するときの変更内容の決定に使用されます。
```

続いて　次のコマンドを　パッケージマネージャーコンソールに実行することで
databeseがUpdateされます。

```
Update-Database
```

実際にDBが作られたかどうかは
SQL Server Management Studio (SSMS) を使うと便利です。
https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46608/89df3917-1acf-b47e-7bb2-54e900773596.png)


Qiita 記事だと
https://qiita.com/Nossa/items/d48fbe91ca470748a3d7
参考になります。

今回作ったサンプルをGithubに上げました。
https://github.com/yamuun/EFGetStarted.AspNetCore.NewDb