efcore-d2-db-diagram について
efcore-d2-db-diagramは、Entity Framework CoreプロジェクトからD2データベース図を作成するスキルです。EFのマッピングやマイグレーションを調べ、d2 CLIで描画できる図のソースを生成する手順を案内します。
主な機能
- 01EF Coreのマッピングとマイグレーションの調査
- 02キーとリレーションの表現
- 03インデックスと所有型の反映
- 04生成前の図の設定確認
- 05D2出力の検証と描画
活用シーン
- 01EF Coreデータベースモデルの文書化
- 02エンティティの関係とキーの可視化
- 03SVGやPNGに描画するD2図の生成
MCP 対応
このスキルにMCPサーバーは不要です。d2 CLIで描画できるD2ソースをテキストとして生成します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ awesome-copilot --skill efcore-d2-db-diagramインストール後、Claude Code で/efcore-d2-db-diagramを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/d2-erd-style.mdefcore-model-extraction.mdgrouping-modes.mdquality-gate.mdrelationship-rules.md詳細
EF Core D2 データベース図ジェネレーター
使用する場面
ユーザーが Entity Framework Core のコードベースからデータベース/ERD 図の生成を求めている場合に、このスキルを使用します。
一般的な依頼の例:
- EF Core のエンティティから D2 データベース図を生成する。
- テーブル、列、主キー、外部キー、リレーションシップを可視化する。
DbContext、DbSet<T>、IEntityTypeConfiguration<T>、Fluent API、マイグレーションを分析する。d2CLI で SVG/PNG にレンダリングできる.d2ファイルを作成する。- ASP.NET Core/.NET プロジェクトのデータベースモデルを文書化する。
目標
C# クラスの形状だけでなく、実際の EF Core の永続化モデルを反映した、読みやすい D2 のエンティティ・リレーションシップ図を作成します。
図では、次の項目を優先します。
- データベースのテーブルとリレーションシップ。
- 主キー、外部キー、必須/任意の列。
- 所有型と値オブジェクト。
- 多対多のリレーションシップと結合テーブル。
- インデックス、一意制約、テーブル名。
- 明示的なマッピングがない場合に限り、EF Core の規約。
出力は .d2 のソースコードです。d2 CLI を使用して SVG または PNG にレンダリングできます。
ツール
- d2 CLI:
.d2ファイルを SVG/PNG にレンダリングします。d2 input.d2 output.svgd2 --layout=elk input.d2 output.svg
- d2 fmt:D2 ファイルを整形します。
d2 fmt input.d2
- MCP サーバーは不要です。このスキルは D2 のソースコードをテキストとして生成します。
推奨ワークフロー
- EF Core プロジェクトの構成を確認します。
- すべての
DbContextクラスを特定します。 - すべての
DbSet<T>宣言を特定します。 - エンティティクラス、所有型、列挙型、値オブジェクトを特定します。
OnModelCreatingとすべてのIEntityTypeConfiguration<T>クラスを確認します。- テーブル名、結合テーブル、インデックス、削除動作を確認するため、利用可能な場合はマイグレーションを確認します。
- D2 を記述する前に、正規化されたデータベースモデルを構築します。
- 生成前に必須の図に関する質問を行います。
- 生のクラスのネストではなく、データベースモデルを使って
.d2ファイルを生成します。 - 納品前に
d2 fmtで D2 の構文を検証します。 - 可能であれば
d2 --layout=elk schema.d2 schema.svgでレンダリングします。 - 再生成する場合は、まず EF Core のマッピングとマイグレーションを再確認します。
図の生成前に必ず確認する質問
新しい図を生成する場合と再生成する場合は、ユーザーが同じ依頼内ですでに回答している場合を除き、毎回次の質問をします。
どの DbContext を図にしますか?(自動検出/すべて/特定の名前)列を表示しますか?(すべて/キーのみ/なし)列の型を表示しますか?(はい/いいえ)NULL 許容/必須を示すマーカーを表示しますか?(はい/いいえ)インデックスと一意制約を表示しますか?(はい/いいえ)列挙型の値を表示しますか?(はい/いいえ)所有型を表示しますか?(インライン/個別/非表示)多対多の結合テーブルを表示しますか?(明示/コンパクト/非表示)監査用/技術用テーブルを表示しますか?(はい/いいえ)エンティティとして存在しない、マイグレーションのみのテーブルを表示しますか?(はい/いいえ)どのグループ化モードを使用しますか?(境界づけられたコンテキスト/スキーマ/名前空間/フラット)どのレイアウトエンジンを使用しますか?(elk/dagre/tala)どの出力形式を使用しますか?(d2/svg/png)
簡易生成を依頼された場合のデフォルト値:
- DbContext:
auto-detect - 列:
key-only - 列の型:
Yes - NULL 許容マーカー:
Yes - インデックス:
Yes - 列挙型:
No - 所有型:
inline - 結合テーブル:
explicit - 監査用/技術用テーブル:
No - マイグレーションのみのテーブル:
Yes - グループ化:
bounded-context - レイアウト:
elk - 出力:
d2
リファレンス文書
必要に応じて、次の文書を読み込みます。
| リファレンス | 読み込むタイミング |
|---|---|
references/efcore-model-extraction.md | DbContext、DbSet、Fluent API、構成、マイグレーションの読み取りルールを確認するとき |
references/d2-erd-style.md | ERD 図の D2 構文と視覚的な規約を確認するとき |
references/relationship-rules.md | 1 対 1、1 対多、多対多、所有リレーションシップの推論方法を確認するとき |
references/grouping-modes.md | 境界づけられたコンテキスト、スキーマ、名前空間、フラットの各グループ化ルールを確認するとき |
references/quality-gate.md | 生成した図を納品する前の最終チェックリストを確認するとき |
EF Core の抽出ルール
ソースの優先順位
ソース間で食い違いがある場合は、次の優先順位を使用します。
- 最新の適用済みマイグレーション/マイグレーションスナップショット。
OnModelCreatingまたはIEntityTypeConfiguration<T>の Fluent API 設定。- データアノテーション。
- EF Core の規約。
- 生の C# クラス構造。
検出が必要な EF Core の概念
次の項目を検出して表現します。
DbContextとDbSet<T>。- エンティティクラス名と、
ToTableによる実際のテーブル名。 ToTable("Table", "schema")によるスキーマ名。HasKey、[Key]、規約、マイグレーションから取得した主キー。- 複合キー。
HasForeignKey、ナビゲーションプロパティ、マイグレーション操作から取得した外部キー。- 明示されている場合の削除動作:
Cascade、Restrict、NoAction、SetNull、ClientSetNull。 - 必須/任意のリレーションシップを示すマーカー。
OwnsOne、OwnsMany、[Owned]による所有型。UsingEntityと暗黙的な EF Core 結合テーブルによる多対多リレーションシップ。HasIndex、IsUnique、マイグレーションから取得したインデックス。- 代替キー(
HasAlternateKey)。 - Fluent API で構成されたシャドウプロパティ。
- 永続化される型や読みやすさに影響する値変換。
- 列挙型プロパティ。
- 無視されるプロパティとエンティティ。
図のレンダリング規則
テーブル
永続化されるテーブルはそれぞれ、可能であれば shape: sql_table の D2 ノードとして表現します。
この内容規約を使用します。
Clients: {
shape: sql_table
constraint: primary_key
Id: uuid {constraint: primary_key}
Name: text
Status: enum
}
sql_table が利用できない場合や、検証エラーの原因になる場合は、構造化テキストを含む長方形にフォールバックします。
リレーションシップ
依存テーブルからプリンシパルテーブルへ向かう方向付きエッジを使用します。
ラベルには、リレーションシップの多重度と、判明している場合は FK 名を含めます。
Offers.ClientId -> Clients.Id: "N:1 FK_Offers_Clients_ClientId"
次の多重度ラベルを使用します。
1:11:NN:1N:Nowned
所有型
所有型は、デフォルトでインライン表示します。
インライン表示の例:
Clients: {
shape: sql_table
Id: uuid {constraint: primary_key}
Address.Street: text
Address.ZipCode: text
Address.City: text
}
ユーザーが separate を選択した場合は、所有型を視覚的に従属するテーブルとして表現し、owned リレーションシップを使用します。
多対多
EF Core が実際のテーブルを作成するため、デフォルトでは明示的な結合テーブルを使用します。
暗黙的な多対多リレーションシップの場合は、生成された結合テーブルノードを作成し、implicit join と示します。
技術テーブル
要求されない限り、技術テーブルはデフォルトで非表示にします。
例:
__EFMigrationsHistory- Hangfire のテーブル
- ASP.NET Identity のテーブル
- 監査ログ
- Outbox テーブル
技術テーブルを非表示にした場合は、図の後の概要でそのことに触れます。
グループ化モード
bounded-context:検出したドメイン領域またはフォルダー/モジュールでグループ化します。schema:データベーススキーマ(例:public、auth、billing)でグループ化します。namespace:C# 名前空間でグループ化します。flat:コンテナーを使わず、すべてのテーブルを同じ階層に配置します。
スタイル規則
一貫したスタイルを使用します。
- 主エンティティのテーブル:実線の枠線。
- 結合テーブル:破線の枠線。
- 所有型:薄い線、または入れ子のインラインフィールド。
- 技術テーブル:控えめなスタイル。
- 外部テーブルまたはマイグレーションのみに存在するテーブル:点線の枠線。
- 必須のリレーションシップ:実線。
- 任意のリレーションシップ:破線。
- カスケード削除:ラベルの接尾辞
cascade。
提出前の品質確認
図を提出する前に、次の項目を確認します。
- 選択した DbContext が明確である。
- すべての
DbSet<T>エンティティを検討している。 - Fluent API の構成を確認している。
- マイグレーションが存在する場合は確認している。
- テーブル名とスキーマ名が EF Core のマッピングと一致している。
- 主キーが含まれている。
- 外部キーと多重度が表現されている。
- 所有型がユーザーの選択に従って処理されている。
- ユーザーが別の方法を求めていない限り、多対多の結合テーブルが明示されている。
- 非表示の技術テーブルが最終概要に記載されている。
-
d2 fmtで D2 構文が有効である。 - コンテナー内のエッジ端点が完全なドット表記を使用している。
- 図が読みやすく、エッジの交差が多いレイアウトを避けている。
出力形式
ユーザーがスキルのインストールを依頼した場合は、次のフォルダー構成を提示します。
.github/
skills/
efcore-d2-db-diagram/
SKILL.md
references/
efcore-model-extraction.md
d2-erd-style.md
relationship-rules.md
grouping-modes.md
quality-gate.md
ユーザーが図の生成を依頼した場合は、次の内容を提示します。
.d2ソースファイルの内容。- 選択したレイアウトエンジンを使用したレンダリングコマンド。
- 前提条件と非表示のテーブルの簡潔な概要。