.NETCore2.1でCRUDを実装する方法

#.NETCore2.1で任意DBを対象にしたCRUDを実装

今回は情報の少ない.NETCoreの導入として、まずは動かしてみたということでMVCモデルを用いてCRUDを実装する話です。
実装環境は以下の通りとなっています。

・Windows 10 1809
・VisualStudioCommunity2019 16.2.0
・.NETCore2.1

最終的に、Webブラウザ上からデータベースの制御ができるようになることを目指します。


##VisualStudioで.NETCore2.1のプロジェクト作成

まずはVisualStudioでプロジェクトを作成していきます。起動後に「新しいプロジェクトの作成」を選択してください。

![t01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/e0bb240d-115d-5014-9d98-4ed8c58db4a4.png)


ASPNET Core Webアプリケーション（開発言語C♯）を選択します。

![t02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/a41ac037-d1e1-9717-53bf-f0f0658c0c14.png)

作成を選択すると次のような画面に遷移するので、「Webアプリケーション（モデルビューコントローラー）」を選択し、認証を「個別のユーザーアカウント」に変更します。
ここで変更を忘れて、デフォルトの「認証なし」のままにしてしまうと、認証を自分で作る必要が出てきますので注意してください。

![t03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/978fafc5-5f3d-9e1d-d93a-9a08e0e5d5e7.png)

![t04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/afc1c9f6-4e91-3b0d-caeb-ec7027b63316.png)



プロジェクトが作成されたらソリューションエクスプローラーを確認して、5つのフォルダが作成できていれば問題ないかと思います。

![t05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/e174ae6f-bcd0-9fbb-c631-6b9dcfc8cfbe.png)


##プロジェクトとデータベースとの連携

###作成したテストDBとプロジェクトとの連携準備

CRUDで制御するための、テスト用データベースの作成を行っていきます。今回は以下のような簡易データベース「TestDb」を作成しました。
VisualTsudio側のソリューションエクスプローラー側でも、作成したデータベースの中身が確認できます。

![t07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/d54d1339-bea9-2aa0-03de-91c6ced23092.png)

![t06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/8ef609e0-baf3-fe28-4219-d64b87f8c884.png)


PowerShellを起動して、カレントディレクトリをプロジェクトファイルの「Models」フォルダのあるフォルダまで合わせておきます。
そこで以下のコマンドを入力します。

```
$ dotnet ef dbcontext scaffold "Data Source=[SourceLink];Initial Catalog=TestDb;User ID=[ID];Password=[Password];Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;" Microsoft.EntityFrameworkCore.SqlServer -o Models -f
```


![t11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/d62b1f3d-c2cc-7632-cbac-f38b1844a84a.png)


実行後、Modelsフォルダに「TestDbContext.cs」が作成されていればOKです。

![t10a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/935594d5-7508-c41a-485b-468d04746173.png)


###プロジェクトで作成したテストデータを読み出す


appsetting.jsonに、TestDbConnectionの行を追加してください。左側は任意の変数名、右側は先ほどPowerShellで入力したのと同じ値が入ります。


```json:appsetting.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-hogehoge-[autoinput];Trusted_Connection=True;MultipleActiveResultSets=true",
    "TestDbConnection": "Data Source=[MySoursePass];Initial Catalog=TestDb;User ID=[Id];Password=[Pass];Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
```


Jsonファイルに追記したあとは、設定した変数名を使ってStartup.csを編集します。今回の場合は「TestDbConnection」という任意の名前を設定しました。
ConfigureServicesメソッドに、以下の行を追加してください。ビルドが無事に完了すれば、プログラムがSqlServerで作成したデータベースを読みにいくための用意が整います。



```c#:Startup.cs
     services.AddDbContext<TestDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("TestDbConnection")));
```



###CRUDページの作成

Controllersフォルダの上で右クリックし、「追加」→「新規スキャフォールディングアイテム」を選択します。
次に「Entity frameworkを使用したビューがあるMVCコントローラー」を選択します。

![t20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/de09fae0-cf62-88b2-b724-dd14cfa2fef1.png)


モデルクラスは、先ほど作成されたModelsフォルダ内の「User」、データコンテキストクラスは「TestDbContext」を選択します。コントローラー名は自動で入力されるかと思いますが、今回は以下のように設定しました。

![t21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/d7271f00-31eb-c02e-aae7-ff8bc24ac408.png)


プロジェクトを開き、URLの最後に/Usersを付与してやると次のようなページが開きます。
あらかじめデータベースに追加しておいたテストデータが表示されるとともに、Create、Details(Read)、Edit(Update)、DeleteのCRUDモデルに従って、データベースの制御ができるようになっているかと思います。


![t22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480272/08fde3fb-2732-8ab5-bf07-acc22e1955a2.png)



#おわりに

ASP.NET Coreはまだまだ情報が少なく、入門書の通りに操作しても苦労する部分も多いですが、とりあえず動くところまではたどり着くことができました。
今後開発を行う方の参考になれば幸いです。