既存の製品のポイント リリースである今後のプロジェクトで Microsoft の Entity Framework を使用することを検討しています。現在の製品は 2 つの DBMS (Oracle と SQL Server) をサポートしており、それぞれのスキーマは個別の .sql スクリプト ファイルに保持されています。
エンティティ フレームワーク (4.1) は、コード生成、リフレクションなどを介してさまざまなシナリオを自動的に実装できるため、魅力的に見えます。しかし、私が知る限り、これらの利点のいくつかは相互に排他的であるように見えます。
たとえば、複数の DMBS をサポートするには、モデルまたはコードを最初に設計する必要があると推測しています。その場合、EF はモデルに従ってそれぞれのスキーマを生成します (これに関する投稿やドキュメントはほとんどまたはまったく見たことがありません)。ので、間違っているかもしれません)。これは、既存のスキーマを放棄する (モデル優先) か、マップする (コード優先) 必要があることを意味します。さらに、EF はスキーマのアップグレードを (データを消去せずに) サポートしていないように見えるため、スキーマの更新には手動のスクリプトが必要になります。
- モデル ファーストとコード ファーストは、EF で複数の DBMS をサポートする唯一の実行可能な手段ですか? 任意の 2 つのスキーマが同じであることを保証することは技術的に不可能であることを認識しているため、これは正しいと考えています。
- コード ファーストと複数の DBMS システムへのマッピングの潜在的な落とし穴はありますか? たとえば、Oracle には自動インクリメント列がありません。シーケンスを使用する必要があります。これは DbContext でどのようにマップされますか? DBMS ごとに個別のマップを作成する必要がありますか?
- EF は、既存の DBMS スキーマを EF モデルを代表するものにアップグレードするメカニズムをサポートしていますか (スキーマの再作成 =/= アップグレード)、またはこれを手動で行うことに制限されていますか?
- 最初にデータベースを使用して複数の DBMS をサポートする方法を 1 つ思いつきましたが、これはメンテナンスの悪夢です。アイデアは、生成された 2 つのデータ モデルに抽象化の別のレイヤーを追加し、EF で生成されたモデルごとにコンバーター クラスを作成することでした。これは、各 DBMS が潜在的に独自のモデルを持つことができるようにするための最良の方法のように思えますが、私のコードはマッピングを処理します。しかし、これを行うことで、EF から実際に得られるものは何でしょうか? おそらくクエリ生成ですが、それだけの価値はありますか?