nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Dapper.FastCRUD:ModelGeneratorを使う

Dapper.FastCRUDはDapperのExtensionライブラリです。DapperのExtensionライブラリは多数ありますが、以前に簡単に比較記事を書いていますので、良かったらご覧ください。

Dapperの拡張ライブラリは何がいいのか?ちょっとだけ調べてみた - nuits.jp blog

Dapper.FastCRUDにはDapper.FastCrud.ModelGeneratorという、データベースのスキーマからModelクラスを自動生成してくれるT4テンプレートがNuGet上に公開されています。

本エントリーでは、Dapper.FastCrud.ModelGeneratorを利用してModelクラスを自動生成する方法を解説します。

あと良かったらこちらもどうぞ。

www.nuits.jp

1. 前提条件

  • Visual Studio 2017 Version 15.5.6
  • .NET Framework 4.7.1
  • SQL Server 2017 Developer Edition(14.0.1000.169)
  • SQL Server上にサンプルDB「Northwind」を設定済みである
  • Windows認証で上記DBが利用できる状況にある

Northwind の設定方法は、つぎをご覧ください。

www.nuits.jp

2. コンソールプロジェクトを作成する

ここでは Northwind という名称で作ります。

f:id:nuitsjp:20180218221125p:plain

3. NuGet パッケージをインストールする

つぎのパッケージをインストールします。

  1. Dapper.FastCRUD
  2. Dapper.FastCrud.ModelGenerator

Dapper.FastCrud.ModelGenerator をインストールすると、Modelsフォルダが作成され二つの「~.tt」ファイルが作成されます。これは 「T4 テキスト テンプレート」といい、ソースコードを自動生成するテンプレートになります。

f:id:nuitsjp:20180218224027p:plain

これを利用して Dapper から利用できるテーブルにマッピングするクラスを生成します。

5. App.configにConnectionStringを定義する

App.config ファイルにつぎのように ConnectionString の設定を追記します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Northwind"
         connectionString="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True;"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
  </startup>
</configuration>

6. SampleModelGeneratorConfig.ttを修正する

6.1. ファイル名を変更する

ソースコードは SampleModelGeneratorConfig.tt を利用して生成します。

基本的に自動生成されたソースはそのまま利用し手で修正するのは避け、DBに変更があった時は再びテンプレートからすべてのクラスを再生成したほうが問題がないでしょう。

このため SampleModelGeneratorConfig.tt はずっと残して構成管理もします。という事で、「Sample」はちょっとよろしくないため、ModelGeneratorConfig.tt などに変更しましょう。

6.2. ModelGeneratorConfig.ttを修正する

ModelGeneratorConfig.ttを開いて、「ConnectionStringName」と「Namespace」を適切な値に修正しましょう。

今回の場合、つぎのように修正します。

<#@ template hostspecific="True" #>

<#
/*
This is the configuration file for GenericModelGenerator.tt
*/
    // Settings
    ConfigPath = @""; //Looks in current project for web.config or app.config by default. You can override it to point to a different config file.
    ConnectionStringName = "Northwind"; // Uses the last connection string in the config if not specified
    Namespace = "Northwind.Models";

ConnectionStringName は App.config で定義した ConnectionString の名称を指定します。App.config から ConnectionString を取得してデータベースへ接続し、データベースのメタデータを取得してコードを生成しています。

7. コードを生成する

ビルドします。

すると ModelGeneratorConfig.tt ファイルのしたの ModelGeneratorConfig.cs にテーブルに対応するクラスが生成されます。

f:id:nuitsjp:20180218222846p:plain

8. コードを再生成する

データベースが変更されたら、テンプレートからコードを再生成します。

ModelGeneratorConfig.tt を右クリックし、「カスタムツール の実行」を選択することで再生成されます。

f:id:nuitsjp:20180218223121p:plain

9. 生成されたコードを利用する

それでは試しに使ってみましょう。「System.Configuration」へのアセンブリ参照を追加し、Program.cs につぎのように記述して、実行してみましょう。

static void Main(string[] args)
{
    var settings = ConfigurationManager.ConnectionStrings["Northwind"];
    var factory = DbProviderFactories.GetFactory(settings.ProviderName);
    using (var connection = factory.CreateConnection())
    {
        connection.ConnectionString = settings.ConnectionString;
        connection.Open();

        foreach (var employee in
            connection.Find<Employee>(statement => statement
                        .OrderBy($"{nameof(Employee.EmployeeID)}")))
        {
            Console.WriteLine($"EmployeeID:{employee.EmployeeID} FirstName:{employee.FirstName} LastName:{employee.LastName}");
        }
    }
    Console.ReadLine();
}

実行すると、つぎのように表示されます。

f:id:nuitsjp:20180218223633p:plain

以上です。