nuits.jp blog

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

Dapper.FastCrud.ModelGeneratorでスキーマ名を明示的に指定する

Dapper.FastCrud.ModelGeneratorを利用することで、DapperおよびDapper.FastCrudから利用できるテーブルに対応するクラスを手軽に作成することができます。

Dapper.FastCRUD:ModelGeneratorを使う - nuits.jp blog

しかし標準のテンプレートではスキーマ名が指定されないため、デフォルトのスキーマ(SQL Server だと dbo)だけ利用している分には問題ないのですが、任意のスキーマを利用していた場合、自動生成されたコードでは実行時にエラーになります。

なおGistに、この問題とあわせて、数字始まりのカラムでコンパイルエラーになる問題にも対応したテンプレートを公開しています。こちらから GenericModelGenerator.tt と SampleModelGeneratorConfig.tt の二つのファイルをコピペすることで、対応することもできます。

Template for setting Schema name for Dapper.FastCrud.ModelGenerator · GitHub

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

www.nuits.jp

それではコード生成時に明示的にスキーマ名を指定するように、テンプレートを修正する方法を説明します。

1. 前提条件

  • Dapper.FastCrud.ModelGenerator 2.4.1

2. GenericModelGenerator.ttを編集する

44行目あたりに、つぎのようなコードがあります。

    /// <summary>
    /// A class which represents the <#=tbl.Name#> <#=(tbl.IsView)?"view":"table"#>.
    /// </summary>
    [Table("<#=tbl.Name#>")]

これを、つぎのように修正します。

    /// <summary>
    /// A class which represents the <#=tbl.Name#> <#=(tbl.IsView)?"view":"table"#>.
    /// </summary>
    [Table("<#=tbl.Name#>", Schema = "<#=tbl.Schema#>")]

すると、生成されたコードが、つぎのようにスキーマ名が明示的に設定されるようになります。

/// <summary>
/// A class which represents the EmployeePayHistory table.
/// </summary>
[Table("EmployeePayHistory", Schema = "HumanResources")]
public partial class EmployeePayHistory
{
    ...

以上です。