Entity Framework CoreでSQL Serverに接続する【実践編②】

こんにちは。エンジニアの藤原です。

この記事では、.NET Webアプリケーション開発でDBフレームワークである EntityFrameWorkCore(以下、EFCoreと記載)について取り上げています。

今回は実践編②ということで実際にEFCoreを介してDBからデータを取得します。

:::note warn
注意
本記事は事前準備とContextクラスの作成が完了している方向けに作成しています。
まだの方はこちらの記事を参考にしてください。

・Entity Framework CoreでSQL Serverに接続する【準備編】
https://qiita.com/pesysyon/items/54b51c70a31a41eef035

・Entity Framework CoreでSQL Serverに接続する【実践編①】
https://qiita.com/pesysyon/items/457e884917ce41f53e69
:::

# 目次
・DBContextクラスとは
・接続先の設定
・モデルの作成
・プロパティの作成
・DBからデータの取得
・最後に

## DBContext クラスとは
前回の記事でも記載しましたが、改めて「DBContext」とは何なのか・・

DBコンテキストクラスとは、一言でいうと「データベースとのやり取りを管理する中心的な役割を果たすクラス」と言えます。
このクラスでデータベース接続を管理するので、EFCoreにおいて欠かせない重要な役割を担っているわけです。
その他にも「エンティティとDBのマッピング」「クエリの実行と追跡」「トランザクションの管理」など大切な幾つかの役割を担います。

より詳しく知りたい方は公式ページを読んでみることが良いと思います。
[Entity Framework Core Microsoft公式ページ](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.entityframeworkcore.dbcontext?view=efcore-9.0)

## 接続先の設定
「さっさとデータを取得したい！」という気持ちを抑えつつ、、
まずは前回作成したDBContextクラスに接続先の設定をしましょう:keyboard:
```cs
namespace TestProject.Test
{
    internal class TestDbContext:DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 接続文字列を作成
            var builder = new SqlConnectionStringBuilder();
            builder.DataSource = @"(localdb)\\MSSQLLocalDB";
            
            // DB名
            builder.InitialCatalog = "TestDB";
            // 今回はWindows認証を使用
            builder.IntegratedSecurity = true;

            // SQL Server を使用
            optionsBuilder.UseSqlServer(builder.ConnectionString);
        }
    }
}
```
DBと接続するためには「接続文字列」が必要です。
SqlConnectionStringBuilder インスタンスを生成してオプションで設定していきます。

上画像の通りに接続文字列(今回はローカルDB)・DB名・認証方法・使用するDBを指定します。

## モデルの作成
続いて、データベースとアプリケーションコードをつなぐ マッピング（ORM）を行うために、
Modelクラス(エンティティクラス)を作成します。

作成したModelクラスがデータベースのテーブルとコードの橋渡しをしてくれます。

:::note warn
注意
本来であればModelクラスは別ファイルに定義することが多いですが、
今回はこのまま同ファイルに定義しています。
:::

```cs
public class Member
{
    public int MemberID { get; set; }

    public string MemberName { get; set; } = string.Empty;

    public string MemberAddress { get; set; } = string.Empty;
}
```

ご自身が作成されたテーブル定義に合わせて設定してください。

## プロパティの作成
ここまで出来たら DbSet<T> という型のプロパティを DbContext クラスに定義していきます。

DbSet<T> のプロパティが DbContext クラスに必要な理由としては、Entity Framework Core（EF Core）を通じてデータベースの特定のテーブルにアクセスし、データの取得・追加・更新・削除を行うためです。

```cs
internal class TestDbContext:DbContext
{
    // 追加
    public DbSet<Member> Member { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 接続文字列を作成
        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = @"(localdb)\\MSSQLLocalDB";
        
        // DB名
        builder.InitialCatalog = "TestDB";
        // 今回はWindows認証を使用
        builder.IntegratedSecurity = true;

        // SQL Server を使用
        optionsBuilder.UseSqlServer(builder.ConnectionString);
    }
}
```

ここまでで以下のような流れになります:pencil2:

DBのテーブルにアクセスしたい
↓
同じ型となるモデルを作成
↓
DbSetという型のプロパティを介してアクセスする

## DBからデータの取得
それでは最後にDBからデータを取得しましょう。

今回は Windows Form にボタンを1つだけ配置して、押されたらデータベースから
データを取得することで確認します。

ボタンを配置したらクリックイベント内でデータを取得しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/21152314-6dba-e12c-78c1-f2e21d1c66f8.png)

C# のLinqを使用してシンプルにデータを取得します。
(めちゃくちゃシンプル...)
ここで先ほど作成したModelクラスを指定します。
```cs
private void button1_Click(object sender, EventArgs e)
{
    using (var context = new TestDbContext())
    {
        List<Member> list = context.Member.ToList();
    }
}
```

## 最後に
いかがだったでしょうか。
EFCore を介すことで、予想よりはるかに簡単にDBとコードを橋渡しできます。
今回ご紹介したものは EFCore の一部に過ぎませんが、初学者の方や困っている方の助けに少しでもなれたら幸いです。
ここまで読んでくださってありがとうございました！

以上、藤原でした。