EDMX の設計資産を抱えたまま Visual Studio 2012 を残すのはコストもリスクも高い――。本記事は、旧来の EDMX コード生成(特に EF 4 の ObjectContext 形式)を、Visual Studio 2022 のみで“再現”し、安全に運用・保守するための実践手順とノウハウをまとめたものです。現場でそのまま使える設定値・プロパティ名・落とし穴の回避策まで具体的に記します。
前提と到達点
前提:レガシーな業務システムで、Visual Studio 2012 で作成された EDMX(EF 4/EF 5/EF 6 向け)を継続利用したい。社内標準 IDE は Visual Studio 2022 に統一済みで、旧バージョンの追加導入は避けたい。
到達点:VS 2022 だけで VS 2012 と同等の EDMX コード生成を実現し、(1)DbContext 形式も(2)ObjectContext 形式も選択的に出力できる状態にする。さらに、ビルドや運用時の注意点・トラブル対処を整備して長期保守できる体制を作る。
要点の整理(結論のクイックサマリ)
| 手段 | 手順・ポイント | 適用対象 |
|---|---|---|
| A. VS 2022 + EF 6 Tools(推奨) | VS インストーラーの 個別コンポーネントで Entity Framework 6 tools を追加。 .NET Framework プロジェクトに ADO.NET Entity Data Model を追加し、デザイナーで EDMX を作成。 自動配置される *.Context.tt / *.tt が DbContext 形式の C# を出力。 | EF 6 を使う既存/新規プロジェクト全般 |
| B. 旧 T4 テンプレートを手動流用 | 過去環境・社内資産・拡張機能アーカイブから DbContext/POCO 向け T4 を取得。 EDMX と同じフォルダに配置し、ファイル名を MyModel.Context.tt / MyModel.tt に合わせる。 テンプレート内の Model1.edmx を自分の EDMX 名に置換。EDMX の Code Generation Strategy は「None」にする(重複生成防止)。 | EF 4〜6 で DbContext 形式を明示的に採用したい場合 |
| C. Legacy ObjectContext で EF 4 スタイル復活 | EF 6 Tools を入れた VS 2022 で EDMX を開く/作成。 既定の *.tt を使うなら削除。 EDMX デザイナーのプロパティで Code Generation Strategy = “Legacy ObjectContext” を指定。 保存すると *.Designer.cs が生成され、ObjectContext 形式に。 | EF 4 時代の ObjectContext 形式を維持する場合 |
| D. NuGet で EF 4.3.x を導入して検証 | VS 2022 の .NET Framework クラスライブラリへ EntityFramework 4.3.1 を追加。 上記 C と組み合わせて、古い API 群へ互換動作を確認。 十分な検証のうえ、運用適用は段階的に。 | 既存コードが EF 4.0 系 API に強く依存する場合 |
前提環境と互換性の目安
EDMX デザイナー(データベース ファースト)の設計/生成は .NET Framework プロジェクトで利用します。.NET(Core/5+) では EDMX デザイナー自体が前提としないため、データモデルを含む部分は .NET Framework 4.6.2〜4.8.x のクラスライブラリに切り出す構成を推奨します。
| 項目 | 推奨/既知の前提 | 補足 |
|---|---|---|
| Visual Studio | Visual Studio 2022(最新版) | インストール構成で Entity Framework 6 tools を有効化 |
| ターゲット フレームワーク | .NET Framework 4.6.2〜4.8.1 | 4.8.x を優先(サポートと TLS/暗号スイートの観点) |
| EF ランタイム | EF 6.x(DbContext 推奨) / EF 4.3.1(検証用) | EF 4 は既にサポート外。保守とセキュリティの観点で EF 6 へ移行計画を |
| DB プロバイダー | System.Data.SqlClient(SQL Server)など | デザイナーは 32/64bit の OLE DB/ODBC 依存に注意(デザイン時のみ) |
A. VS 2022 + EF 6 Tools で DbContext 形式を生成(推奨)
インストールと準備
- 「Visual Studio インストーラー」を開き、現在の VS 2022 を 変更。
- 個別コンポーネント から Entity Framework 6 tools をチェックして適用。
- ワークロードは「.NET デスクトップ開発」を入れておくと、関連テンプレートが揃います。
EDMX の追加とウィザード
- 対象の .NET Framework プロジェクト(例:4.8 のクラスライブラリ)を開く。
- プロジェクトを右クリック → 追加 → 新しい項目から ADO.NET Entity Data Model を選び、モデル名(例:
MyModel.edmx)を指定。 - ウィザードで 「デザイナーからデータベース」(EF Designer from database) を選択。
- 接続文字列を作成し、テーブルやビュー、ストアドを選んで完了。
完了すると、EDMX の隣に MyModel.Context.tt と MyModel.tt が自動生成されます。これらの T4 テンプレートが DbContext 形式の C# コード(コンテキストとエンティティ)を出力します。
プロパティの正しい組み合わせ
- EDMX の Code Generation Strategy は None が既定(T4 に発行を任せる)。
*.ttの Custom Tool は TextTemplatingFileGenerator(既定)。これが 保存時に自動変換を行います。
既存 EDMX(VS 2012 由来)を持ち込むときのコツ
- 旧ソリューションから
.edmxと.edmx.diagramをコピーし、プロジェクトへ追加。 - もし
*.Designer.csが残っていれば一旦削除(ObjectContext の旧生成物)。 - EDMX を開き、デザイナーの空白を右クリック → Code Generation Item の追加から EF 6.x DbContext Generator を選ぶと、必要な
*.ttが再配置されます。
出力コードの確認
// 例: DbContext 形式の断片
public partial class MyModelContext : DbContext
{
public MyModelContext() : base("name=MyModelEntities") { }
public virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Order> Orders { get; set; }
}
構成ファイルの接続文字列例
<connectionStrings>
<add name="MyModelEntities"
connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;
provider=System.Data.SqlClient;
provider connection string="Data Source=SERVER;Initial Catalog=DB;
Integrated Security=True;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
EF 6 では EntityFramework.dll が参照に追加されます。System.Data.Entity(フレームワーク内蔵)との混同が起きやすいので、参照解決の警告に注意してください。
B. EF 4/5/6 向け T4 テンプレートを手動で流用する
過去の拡張機能(VSIX)や社内レポジトリに残っている T4 を直接流用する方法です。VS 2022 で使ううえでも仕組みは単純で、EDMX を入力に *.tt が C# を出力するだけです。
手順
- テンプレートの入手:社内バックアップや旧開発機にある DbContext Generator 系 VSIX を探し、拡張子を
.vsix→.zipに変更して展開。中のCSharpDbContext.Context.tt/CSharpDbContext.Types.ttなどを取り出します。あるいは、過去のリポジトリに残る T4 を再利用しても構いません。 - 配置と命名:EDMX と同じフォルダに置き、
MyModel.Context.tt/MyModel.ttにリネーム。 - テンプレート内の参照名修正:先頭付近にある
Model1.edmxやInputFileの指定をMyModel.edmxに置換。 - EDMX の出力切り替え:EDMX のプロパティ Code Generation Strategy = None に設定(ObjectContext の
*.Designer.csを無効化)。 - 自動変換の有効化:
*.ttの Custom Tool が TextTemplatingFileGenerator であることを確認。
テンプレート微調整のヒント
- 名前空間・アクセス修飾子:T4 上部の定数で既定名前空間を固定できます(ソリューション横断で一貫性を担保)。
- プレーン POCO 生成:等価比較や
virtualの有無、ObservableCollection利用の可否など、チーム標準に合わせて調整可能。 - 生成ファイルの分割方針:1 エンティティ 1 ファイル出力に変更して差分を見やすくする運用も有効です。
よくあるビルドエラー
Could not load file or assembly 'EntityFramework':プロジェクトに EF ランタイムが参照されていない。NuGet で追加。Running transformation ... failed:T4 の hostspecific/相対パス設定が誤り。$(ProjectDir)を用いた絶対参照にすると安定します。
C. 「Legacy ObjectContext」モードで EF 4 スタイルを復活
EF 4 時代の ObjectContext と EntityObject ベースのコードをそのまま維持したい場合の最短手順です。
設定手順
- EDMX をデザイナーで開く(VS 2022 + EF 6 Tools 必須)。
- デザイナーの何もない箇所をクリックし、プロパティウィンドウを表示。
- Code Generation Strategy を Legacy ObjectContext に設定。
- 保存(Ctrl + S)すると
MyModel.Designer.csが再生成されます。*.ttが存在していた場合は重複を避けるため削除しておくのが安全です。
生成物の特徴
- コンテキストは
ObjectContextを継承し、IObjectSet<T>/ObjectSet<T>を用いるパターン。 - エンティティは
EntityObjectを継承する形式(通知やリレーションのトラッキングが組み込み)。 - 部分メソッド
OnContextCreated()などに拡張ロジックを追加可能。
使用例(ObjectContext)
using (var ctx = new MyModelEntities())
{
var q = from c in ctx.Customers
where c.IsActive
select c;
foreach (var c in q) { /* ... */ }
}
典型トラブルと回避
- DbContext API と混在:ObjectContext 生成に切り替えたら、
DbSet<T>やDbContextを参照するコードはコンパイル不可。呼び出し側も合わせて修正。 - Designer.cs の競合:ソース管理で
*.Designer.csが手動編集されていると衝突が発生。Designer.cs は編集しない、拡張は partial で分離するのが鉄則。
D. NuGet で EF 4.3.x を導入してレガシー API を検証
既存コードが EF 4.0 系 API に密結合しており、EF 6 への置換が即時には難しい場合の緩和策です。
- .NET Framework のクラスライブラリを用意(4.0〜4.8 で検証)。
- NuGet から EntityFramework 4.3.1 を追加。
- 上記 C の Legacy ObjectContext 生成と組み合わせて、コンパイルと CRUD 動作を確認。
注意:EF 4 は既にサポート終了です。最終的な運用先では EF 6 系へ集約する計画を立て、EF 4.3.x は互換性検証と段階移行のための一時利用にとどめるのが安全です。
運用設計のベストプラクティス
分離と依存の最小化
- データアクセス層をクラスライブラリに分離:UI/Web 層から参照。EDMX と生成コードはこのライブラリに閉じ込める。
- 呼び出し契約の安定化:アプリ層からは Repository / Unit of Work の薄いインターフェイスで抽象化。内部で ObjectContext/DbContext を差し替え可能に。
ビルドと T4 の扱い
- 変換タイミング:T4(
*.tt)は通常 保存時に実行されます。CI で自動変換が必要なら 手動で変換した生成物をリポジトリに含める運用が安定します。 - 差分の見やすさ:エンティティ 1 クラス 1 ファイルで出力する T4 に調整するとレビューが容易。
接続文字列の運用
- EDMX の接続は
metadata=res://*/...を含む EntityClient 形式が既定。運用環境では 接続先だけを構成で切り替える。 - 接続先が増える場合は
DbContext(A/B)に寄せ、name=...を差し替える設計に。
テスト戦略
- 設計時テスト:モデル更新(列追加/NULL 制約変更)→ T4 再生成 → コンパイル → 簡易 CRUD の自動化。
- 回帰テスト:追記のみマイグレーションの方針でも、外部キー必須化などは null データで失敗しやすい。事前にデータ準備。
トラブルシュート(実務で遭遇しがちな項目)
| 症状 | 原因/背景 | 対処 |
|---|---|---|
| 「The provider did not return a ProviderManifestToken string.」 | 接続先 DB にアクセスできない、またはプロバイダー/権限問題 | 接続文字列の provider と provider connection string を確認。デザイン時の接続テストも実施 |
| EDMX を保存してもコードが生成されない | 出力方式の競合(ObjectContext と T4 の二重/無効化) | EDMX の Code Generation Strategy と *.tt の有無を整理。DbContext 形式=「None」+ *.tt、ObjectContext 形式=「Legacy ObjectContext」+ *.Designer.cs |
| 「EntityKey が参照できない」 | DbContext 形式のコードで ObjectContext の型を使おうとしている | どちらの API を使うのか方針を統一。必要ならラッパ層で吸収 |
| ビルドサーバーで T4 が走らない | VS のデザイン時拡張に依存 | 生成済みコードをコミットする運用、あるいはビルド前イベントで TextTransform を呼び出す社内スクリプトを整備 |
| 「Multiple types with the same name」 | エンティティ名/名前空間の衝突 | T4 の名前空間を固定し、Custom Tool Namespace を空にする等で衝突回避 |
| VS 上でモデル更新時に例外 | プロバイダーの 32/64bit ミスマッチ | デザイン時に利用するドライバのビット数を VS と合わせる。必要に応じて Data Sources を再構成 |
安全性と将来計画(運用ガイドライン)
- VS 2012 のライセンスは不要:本記事の手順は VS 2022 の標準機能とテンプレート流用のみで完結。
- EF 4 はサポート外:セキュリティ修正は原則提供されません。機能追加や長期保守が続くなら EF 6(可能なら .NET への再設計)へ移行計画を。
- 生成物のコードレビュー:T4 を触ると一見して差分が大きくなるため、生成規約の変更点は pull request の説明に必ず記述。
- エンティティの拡張は partial で:バリデーションやヘルパは
partialクラスに実装し、*.tt/*.Designer.cs本体は手を触れない。
実装レシピ(すぐ使えるチェックリスト)
DbContext で続ける(推奨フロー)
- EF 6 Tools を有効化。
- EDMX を追加(または持ち込み)し、Code Generation Strategy = None を確認。
*.Context.ttと*.ttを配置し、保存して生成を確認。- 呼び出し側は
DbContext/DbSet<T>API に統一。
ObjectContext を維持(レガシーフロー)
- EDMX の Code Generation Strategy = Legacy ObjectContext に切り替え。
*.ttは削除(重複防止)。*.Designer.csが出力されることを確認。- 呼び出し側は
ObjectContext/ObjectSet<T>API を用いる。
移行の踏み石:ObjectContext から DbContext へ
すぐに API を置換できない場合でも、リポジトリ/ユニットオブワークで抽象化し、アプリ層からは CRUD を同じ契約で呼べるようにします。新規機能は DbContext で増やし、既存は段階的に差し替えるのが安全です。
- 新規テーブル:DbContext でのみ公開し、旧コードには影響を与えない。
- 共通ヘルパ:トランザクション、例外マッピングは共通化し API 差を吸収。
付録:最少トラブルで動かすためのミニ FAQ
Q. EDMX のデザイナーが見つからない/ウィザードが出ない。
A. VS インストーラーで Entity Framework 6 tools の追加を確認。ワークロードや日本語/英語 UI の違いで名称が多少異なることがあります。
Q. .NET(Core/5+)プロジェクトに EDMX を追加できない。
A. EDMX デザイナーは .NET Framework 前提です。データ層を .NET Framework ライブラリに切り出し、UI 層から参照する構造に。
Q. 生成コードの名前空間がズレる。
A. T4 上部の設定定数(名前空間など)を固定し、Custom Tool Namespace を空にするか、プロジェクトで包括的に管理します。
Q. 既存アプリ(WinForms/WebForms/WPF)と連携できる?
A. 参照の解決(EF ランタイムのバージョン合わせ)と app.config/web.config の接続文字列を移植すれば、CRUD はそのまま動作します。
まとめ
- VS 2022 単体で EDMX のコード生成は再現可能。DbContext は T4、ObjectContext は Legacy ObjectContext で出力方式を明確化。
- 最小工数は A(EF 6 Tools)。古いテンプレートを継続利用したい場合は B の手動流用。
- EF 4 系は運用リスク。検証には D を使いつつ、最終的には EF 6 へ寄せる中期計画を。
- 生成物は編集せず partial に拡張、T4 の規約はチームで可視化。CI は生成済みコードのコミット運用が堅実。
実践スニペット:T4 の最上部に置く簡易設定例
以下は MyModel.tt の先頭付近に置くと便利なパラメータ例です(テンプレートの構造に合わせて調整)。
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#
// === チーム標準設定例 ===
string RootNamespace = "Company.Project.Data";
bool UsePluralizationService = true; // 複数形化
bool GenerateSerializationAttributes = false;
bool UseObservableCollection = false; // コレクション型
#>
テンプレートの変更は生成コード全体に影響するため、pull request で意図と検証観点を明記してください。
検収ステップ(移行完了の判定基準)
- Visual Studio 2022 で EDMX の編集・更新・再生成が一通り完了し、差分が意図どおりである。
- 既存アプリにライブラリを差し替え、CRUD・トランザクション・遅延読み込みが期待どおり動作する。
- ビルドサーバーで 生成済みコードのコンパイルが通り、配置パッケージに余計なデザイナ資産が混入していない。
- 開発規約に 出力方式(DbContext/ObjectContext)、T4 の編集ルール、接続文字列の変更手順が追記済み。
最後に:このやり方が“安全”な理由
本記事の手法は、VS 2022 標準の EF 6 Toolsと既存 T4 の流用だけで完結します。IDE を併存させずに済むため、脆弱な旧 IDE を社内に残置しないというセキュリティ上のメリットが得られます。開発環境を VS 2022 に統一しつつ、レガシー EDMX の資産価値を最大化できる現実的なソリューションです。
付記:サマリ(短縮版)
- DbContext:Code Generation Strategy = None +
*.tt(EF 6 Tools) - ObjectContext:Code Generation Strategy = Legacy ObjectContext +
*.Designer.cs - T4 流用時は
Model1.edmx→ 実ファイル名に置換、Custom Tool は TextTemplatingFileGenerator - EF 4.3.1 は検証まで。本番は EF 6 に寄せる計画を

コメント