緩くお手軽に .NET Core Web アプリを作ろう(その2)
2019-09-11
azblob://2022/11/11/eyecatch/2019-09-11-create-a-netcore-webapp-loosely-and-easily-part2-000.jpg

前回の続きです。

データベースの素を作る

データベースを用意するのは面倒ですよね。環境を用意したこと無い方には想像もつかない作業だと思います。
「こういうデータをとりあえず突っ込みたいんだけど」というレベルの時には非常に面倒だと思います。
でも、Entity Framework Core を使えば、データベースの素となるクラス(Model)を用意すれば、少ない実装量でデータベースとテーブルの用意ができてしまいます。
早速作ってみましょう。

「組織情報テーブルの素」の作成

ソリューション エクスプローラーで Models フォルダを右クリックして、「追加」「クラス」を選びましょう。
「新しい項目の追加」のダイアログが表示され「クラス」が選ばれている状態だと思うので、組織を表すクラスファイル Organization.cs を作ります。

ファイルを作成したら、クラス定義を下記のように修正しましょう。

    /// <summary>
    /// 組織
    /// </summary>
    public class Organization
    {
        /// <summary>
        /// 組織ID
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 組織名
        /// </summary>
        public string Name { get; set; }
    }

プロパティを2つ追加しました。これで組織情報テーブルに対応する情報が作れています。
クラス名がテーブル名に、プロパティ名がテーブル列名になります。
簡単ですね。
ちなみに Id という名前の int 型プロパティは自動的にテーブルのキーとして認識されます。

「ユーザ情報テーブルの素」の作成

同じく Models フォルダを右クリックして、 UserInfo.cs を作成しましょう。
内容は下記の通りです。

    /// <summary>
    /// ユーザ情報
    /// </summary>
    public class UserInfo
    {
        /// <summary>
        /// ユーザID
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// ユーザ名
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 組織ID
        /// </summary>
        public int OrganizationId { get; set; }

        /// <summary>
        /// 組織
        /// </summary>
        public Organization Organization { get; set; }
    }

こちらは 以前の記事 で紹介した通りなので説明不要ですね。
組織情報との関連を持っています。

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

ただクラスを2つ作っただけなので、これだけではDBやテーブルは作られません。
データベースコンテキストというものを作成して使用することで、データベースの作成とテーブルの作成を実施してくれます。

ソリューション エクスプローラーでプロジェクト直下(Modelsと同じ階層)に Data フォルダを作成して、その中に MyDbContext.cs という名前のクラスファイルを作りましょう。

    /// <summary>
    /// DBコンテキスト
    /// </summary>
    public class MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }

        /// <summary>
        /// ユーザ情報
        /// </summary>
        public DbSet<UserInfo> UserInfoes { get; set; }

        /// <summary>
        /// 組織情報
        /// </summary>
        public DbSet<Organization> Organizations { get; set; }
    }

using は下記2行が必要になります。

using DBAccessSample.Models;
using Microsoft.EntityFrameworkCore;

このデータベースコンテキストのクラスにより、コード内のどのクラスがデータベースのテーブルを表現しているかを定義しているイメージです。

依存性注入とデータベース作成先(接続文字列)の設定

データベースコンテキストを定義しただけでは使われないので、依存性注入して実際に使える状態にしましょう。
プロジェクト直下の Startup.cs を開いて、 ConfigureServices メソッドを修正します。

        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.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

services.AddDbContext の行を追加しました。
下記 using の追加が必要です。

using DBAccessSample.Data;
using Microsoft.EntityFrameworkCore;

これでアプリ起動時にデータベースコンテキストが参照できるようになります。

ただ、UseSqlServer メソッドで参照している Configuration.GetConnectionString("DefaultConnection") はまだ書けていません。
プロジェクト直下にある appsettings.json を修正しましょう。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

ConnectionStringsの設定値を追加しました。ここで LocalDB というものを指定しています。軽量の DB エンジンで、アプリ開発のため一時的に使う目的で使われるものです。Visual Studio をインストールしていれば使えると思います。

データベース作成処理の実装

データベース コンテキストを使う準備ができたので、データベース作成処理を実装しましょう。ソリューション エクスプローラーから、先ほど作成した Data フォルダに DbInitializer.cs を追加します。

    public class DbInitializer
    {
        public static void Initialize(MyDbContext context)
        {
            context.Database.EnsureCreated();
        }
    }

上記で「データベースが無ければ作成する」という振る舞いになります。
こちらをプログラム起動時に呼び出すようにしたいので、プロジェクト直下の Program.csMain メソッドを修正します。

        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var context = services.GetRequiredService<MyDbContext>();
                    DbInitializer.Initialize(context);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }

            host.Run();
        }

下記 using の追加が必要です。

using DBAccessSample.Data;
using Microsoft.Extensions.DependencyInjection;

これで準備ができました!

プログラム実行

さあ、画面上部の実行ボタンでプログラムを実行してみましょう!
アプリケーションの見た目は何も変わりませんが、データベースが作成されたはずです。
Visual Studio のメニューから、「表示」→「SQL Server オブジェクト エクスプローラー」を開いて、LocalDB の状態を確認してみてください。

無事、データベースが作成されましたね!

次回は、このデータベースを操作する部分を説明していこうと思います。

============================
◆◇FIXERってどんな会社?◇◆
気になるあなたに、ぜひ参加していただきたい企業説明会を実施しています!
採用担当 が毎回、小さな疑問も大きな不安もじっくりお答えしています♪
聞きづらい質問もどんとこーい!な企業説明会です!
FIXER企業説明会はこちらからどうぞ!

◆◇FIXERでは今、新卒・中途問わず仲間を募集しています!◇◆
ぜひ求人も覗いてみてください!↓↓↓
FIXERの求人はこちらからどうぞ
============================