私はEntity Framework 4で遊んでおり、モデル駆動型のアプローチを使用してエンティティからデータベーススクリプトを生成しています。これは素晴らしいことですが、データベースのバージョン管理に関しては、これがどのように機能するかわかりません。アクティブなレコード タイプの移行フレームワークを使用したい場合は、逆の方法でデータベースからエンティティを生成する必要があると思いますか? モデル駆動型アプローチを使用してデータベースを適切にバージョン管理する方法はありますか?
5 に答える
これは、EntityFramework.Migrations と呼ばれる NuGet パッケージとして近日中に提供される予定です。
TechEd 2011 で Scott Hanselman によってデモが行われました ( http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/DEV349でオンラインで入手可能)。関連セクションは 45 分です。
つまり、パッケージをインストールしたら、パッケージ マネージャー コンソールに次のように入力して、データベース変更スクリプトを生成します。
migrate -script
更新 (2011 年 11 月 13 日)
このパッケージのアルファ 3 ビルドが NuGet で利用できるようになりました。migrate -script
上記のコマンドレットを使用するのではなく、コマンドレットを使用しAdd-Migration <migrationname>
ます。その使用方法のウォークスルーは、ADO.NET チームのブログで見つけることができます。
更新 (2012 年 2 月 14 日)
この機能は、メインのEntityFramework NuGet パッケージの一部として、バージョン 4.3 以降で利用できるようになりました。EF 4.3 を使用した最新のウォークスルーは、ADO.NET チームのブログにあります。
Wizardbyを試すことができます:これはデータベースの移行を管理するためのツールです。EFとは統合されませんが(この点で統合することはほぼ不可能であるため)、EFとは統合されます。
ScottGu は、ブログ エントリでこれについて言及しています。
また、将来的に EF で「移行」機能をサポートする予定です。これにより、データベース スキーマの移行をプログラムで自動化/スクリプト化できるようになります。
[編集]
Morteza Manavi が別の SO answerで回答したように、彼はEntity Designer Database Generation Power Packについて言及している可能性があると思います。
EF.Migrationsライブラリの代替であるEntityFramework.SchemaCompareに取り組んでいます。これにより、dbスキーマをデータベースコンテキストを表すエンティティモデルと物理的に比較できます(EF.Migrationsでは実行されません)。これは、データベースの初期化中に発生するか、要求に応じて手動で発生する可能性があります。次の例を考えてみましょう
#if DEBUG
Database.SetInitializer(new CheckCompatibilityWithModel<DatabaseContext>());
#endif
非互換性の問題が見つかった場合、データベースの初期化中に、dbスキーマとモデルの違いを説明する例外がスローされます。または、この方法でコード内のいつでもこれらの違いを見つけることができます
using (var ctx = new DatabaseContext())
{
var issues = ctx.Database.FindCompatibilityIssues();
}
次に、これらの違いや非互換性の問題を抱えている場合は、dbスキーマまたはモデルを更新できます。
このアプローチは、データベーススキーマとモデルの設計を完全に制御する必要がある場合や、複数のチームメンバーが同じdbスキーマとモデルで作業しているチームで作業する場合に特に役立ちます。EF.Migrationsに加えて使用することもできます。
GitHubでフォークしてください:https ://github.com/kriasoft/data
ActiveRecord のように動作する場合は、ActiveRecord のように動作する必要があります。:)
ただし、モデル ファーストを使用したいが移行を引き続き使用する場合、これは可能ですが、ユーザーに代わって追加の作業が必要になります。モデルファーストは、データベース変更スクリプトを生成します。関連する部分を移行に抽出し、元に戻すスクリプトを手動で作成する必要があります。これには多少の手作業が伴いますが、それほど難しくはありません。