データベースのオブジェクトからエンティティクラスのコードを自動生成する [C#, SQLServer]

データベースのテーブルやビューなどデータをマッピングするエンティティクラスは、O/Rマッパーを使用してデータベースのデータを操作するアプリケーションには必要になります。
そこで今回は、データベースのオブジェクトからエンティティクラスのソースコードを自動生成するプログラム(アプリケーション)を作ってみたいと思います。

作成するプログラムではデータベースのテーブルやビューの構造をクラスのオブジェクトに変換します。テーブルやビューの列はクラスのプロパティとして設定されます。
データベースはSQLServer、ソースコードの言語は.NET FrameworkのC#にします。
ユーザーインターフェース(UI)はWindows フォーム アプリケーションで作成します。
Visual StudioでC#のプロジェクトを新規作成します。
プロジェクトのテンプレートは「Windows フォーム アプリケーション (.NET Framework)」を選択します。

ユーザーインターフェース(UI)

作成するフォームのデザインは次のようになります。

データベースエンティティクラスコード自動生成フォームデザイン

フォームには以下のコントロールを配置します。

コントロール 名前 設定
Form EntityClassCodeGenerator Text: “エンティティクラスコード生成”
Label label1 Text: “スキーマ(&S):”
ComboBox cboSchema Text: “”
Label label2 Text: “オブジェクト(&O):”
RadioButton rdoTable Text: “テーブル(&T)”
RadioButton rdoView Text: “ビュー(&V)”
RadioButton rdoBoth Text: “両方(&B)”
Label label3 Text: “テーブル/ビュー(&E):”
ComboBox cboEntity Text: “”
Label label4 Text: “クラス名(&N):”
TextBox txtClassName Text: “”
Label label5 Text: “オプション(&I):”
CheckBox chkPublic Text: “クラスのアクセス修飾子をPublicにする(&P)”
CheckBox chkComment Text: “コメント用XMLを出力する(&X)”
CheckBox chkRead Text: “クラス名にReadを付加する(&R)”
CheckBox chkDto Text: “クラス名にDtoを付加する(&D)”
CheckBox chkPrivateSet Text: “プロパティを読み取り専用にする (setアクセサーをprivateにする) (&A)”
Button btnCreate Text: “作成(&M)”
Button btnCopy Text: “コピー(&C)”
TextBox txtEntityClassCode Multiline: true
ScrollBars: Both
Text: “”””

エンティティクラスは通常のクラスと、読み取り専用(Read)のクラスと、DTO(Data Transfer Object: データ トランスファー オブジェクト)のクラスを生成できるようにしています。
クラスのアクセス修飾子は「クラスのアクセス修飾子をPublicにする」が選択(チェック)されていればpublicにし、未選択(チェックされていない)であればprotected internalで生成します。
クラスのプロパティ(テーブルの列)のsetアクセサはprivateにするかどうかを指定可能にしています。
クラス、プロパティにはXML Documentコメントを記載するための「///」から始まるコメント書式を出力するかどうかも指定可能にしています。

ソースコード

ソースコードはフォームクラスとWindowsフォームプロジェクトを作成すると生成されるApp.config、Programクラスの他に、データベースアクセス用クラス、データ型(名称)変換クラス、命名規則(名称)変換クラス、コード生成T4テキストテンプレートを作成します。

データベースエンティティクラスコード自動生成Windowsフォームプロジェクト

フォーム EntityClassCodeGeneratorForm.cs

フォームクラスは配置したコントロールのイベントでそれぞれの操作を行う処理を記述していきます。

EntityClassCodeGeneratorForm.cs

フォームのロード時にスキーマ名の一覧をデータベースから取得して「スキーマ」コンボボックスのリストアイテムに設定します。
オブジェクトは選択されているスキーマのオブジェクトを対象に取得して「テーブル/ビュー」コンボボックスのリストアイテムに設定します。
オブジェクトは「テーブル」「ビュー」「両方」から選択可能で「テーブル」選択時はテーブルのみ「ビュー」選択時はビューのみ「両方」選択時はテーブルとビューの両方をコンボボックスのリストアイテムに設定します。
「スキーマ」コンボボックスでスキーマが変更された時には、テーブルおよびビューのオブジェクトを取得して「テーブル/ビュー」コンボボックスのリストアイテムに設定します。
「テーブル/ビュー」コンボボックスのオブジェクトが変更された時に、クラス名を「クラス名」テキストボックスに表示します。
エンティティクラスのコード生成は「作成」ボタンクリック時に行います。ソースコードの作成処理ではオプションで選択されている条件に基づいて、選択されているデータベースのオブジェクトの定義情報をエンティティクラスに変換したコードを生成します。
オプションとして用意している「クラス名にReadを付加する」チェックボックスがチェックされている場合は読み取り専用クラスとして「プロパティを読み取り専用にする (setアクセサーをprivateにする)」のチェックボックスをチェックします。「クラス名にDtoを付加する」チェックボックスがチェックされている場合は「プロパティを読み取り専用にする (setアクセサーをprivateにする)」のチェックボックスのチェックをはずします。

データベースアクセス DatabaseAccessor.cs

データベースアクセスクラスはデータベースに接続してスキーマ、テーブル、ビューの一覧と、指定したテーブルやビューの列定義情報を取得します。

DatabaseAccessor.cs

データ型変換 DataTypeConveter.cs

データ型変換クラスはDataAdapterクラスのFillSchemaメソッドで取得されるデータ型をエイリアス(別名)形式に変換します。

DataTypeConveter.cs

命名規則変換 NamingRulesConveter

命名規則変換クラスは、データベースのオブジェクト名をエンティティクラスのオブジェクト名に変換します。

NamingRulesConveter

ここではデータベースのオブジェクト(テーブル、ビュー、列など)の名前がコンスタントケース(大文字スネークケース)で作成されていたり、テーブル名またはビュー名の先頭に「D_」「M_」「T_」「V_」があることを想定しています。
テーブル名またはビュー名の先頭に「D_」「M_」「T_」「V_」がある場合は除去してクラス名に変換します。
クラス名(テーブル名)、クラスのプロパティ名(テーブルの列名)はパスカルケースに変換します。
(例)T_TABLE_NAME → TableName

コード自動生成T4テンプレート EntityClassCodeTemplate.tt

コードを生成するT4テキストテンプレートでフォーム(画面)で指定された条件に応じてソースコードを生成しています。

EntityClassCodeTemplate.tt

アプリケーションコンフィグ App.config

アプリケーションコンフィグにはデータベースへの接続文字列を記載します。
configurationセクションにconnectionStringsセクションを追加し、connectionStringsの要素にデータベースへの接続文字列を追加します。

App.config

[データベースサーバー]の部分に接続するサーバーの名前やIP+インスタンス名(localhost, SERVER\SQLSERVER2017, 127.0.0.1など)、[データベース名]の部分に接続するデータベースの名前(AdventureWorks2017, TestDataBaseなど)を環境に合わせて指定してください。上記の例ではWindows認証で接続するように設定しています。(Integrated Security=True)

Program.cs

以下のコードは自動で生成されるので変更の必要はありません。

Program.cs

プログラムの実行

プロジェクトをビルドしてプログラム(アプリケーション)を実行します。
接続するデータベースにはMicrosoftが公開しているAdventureWorks2017を使用します。

データベースエンティティクラスコード自動生成プログラム起動

プログラムを起動すると、「スキーマ」コンボボックスのリストアイテムにスキーマの一覧が設定され、リストアイテムの先頭スキーマ(ここではdbo)が選択されます。
選択されたスキーマが所有するテーブルの一覧が「テーブル/ビュー」コンボボックスのリストアイテム設定され、リストアイテムの先頭のテーブル(ここではAWBuildVersion)が選択されます。

エンティティクラスのコードを作成するテーブルまたはビューを選択し、必要なオプションを選んで「作成」ボタンをクリックすると、対象のテーブルまたはビューのエンティティクラスのコードが生成されます。

データベースエンティティクラスコード自動生成プログラム実行結果