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

しかし、標準のテンプレートではデータベースのカラム名が数字で開始していた場合、コンパイルエラーになるコードが生成されてしまいます。ここではテンプレートを修正して、数字始まりのカラムも適切に扱えるよう修正する方法を説明します。

なお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 の修正

2.1. カラム名が数字始まりの場合にColumn属性を指定する

つぎの様な箇所を

    <#}
    }#>    public virtual <#=col.PropertyType #><#=CheckNullable(col)#> <#=col.PropertyName #> { get; set; }

つぎのように修正します。

    <#}
    }
    if (col.Name != col.PropertyName) {#>
    [Column("<#=col.Name #>")]
    <#}
    #>    public virtual <#=col.PropertyType #><#=CheckNullable(col)#> <#=col.PropertyName #> { get; set; }

2.2. 数字始まりのカラムのプロパティへ設定するプレフィクス変数を宣言する

つぎの様な箇所に

string ConnectionStringName = "";
string ConfigPath = "";
string Namespace = "";
string ClassPrefix = "";
string ClassSuffix = "";
string SchemaName = null;

特殊プロパティ用のプレフィクス変数を追加します。

string ConnectionStringName = "";
string ConfigPath = "";
string Namespace = "";
string ClassPrefix = "";
string ClassSuffix = "";
static string SpecialPropertyPrefix = "";
string SchemaName = null;

2.3. プロパティ名生成メソッドを作成する

デフォルトでは、プロパティ名とテーブル名のいずれも CleanUp という Func で管理されていますが、プロパティ名専用の Func を新しく作成します。

元々存在している「static Func<string, string> CleanUp」のあとに、新しくつぎのコードを追加してください。

static Func<string, string> CleanUpPropertyName = (str) =>
{
    str = rxCleanUp.Replace(str, "_");

    if (cs_keywords.Contains(str))
    {
        str = "@" + str;
    }
    else if(char.IsDigit(str[0]))
    {
        str = SpecialPropertyPrefix + str;
    }
    
    return str;
};

2.4. プロパティ名設定箇所の修正

プロパティ名をCleanUpを利用して設定している個所を、先ほど作成したCleanUpPropertyNameを使用するように修正します。

つぎのコードがありますので

col.PropertyName=CleanUp(col.Name);

つぎのように修正してください。

col.PropertyName=CleanUpPropertyName(col.Name);

2. SampleModelGeneratorConfig.tt の修正

つぎの

ClassSuffix = "";

と記載されているコードの、つぎの行に以下のコードを追加してください。

SpecialPropertyPrefix = "Prop";

値は任意です。

以上です。