コアがサードパーティへの直接参照を持たないコア部分とサードパーティモジュールを使用して、モジュール式の非モノリシックアプリケーションの設計でORM(この場合はEF5)を使用する方法についての提案を探していますモジュール、およびモジュールには、コア/共通のテーブルとクラスへの参照のみがあります。
議論のために、十分に近い類推は DNN です。
コードファースト:
CodeFirst で使用したアプローチは、リフレクションを介して Db のモデルを構築することでした。コアの DbContext の DbInitialation フェーズでは、Reflection を使用して、IDbInitializer (カスタムExecute() メソッドを含むコントラクト) を使用して、dll の構造のみを定義します。各 dll は、それ自体について知っていることを DbModel に追加しました。後続の Seeding も同じ wa で処理されました (特定の IDbSeeder コントラクトを検索して実行します)。
長所: * このアプローチは今のところ有効です。* 各レポが dbContext.GetSet() を使用する限り、それが dbContext のプロパティであると想定するのではなく、同じコア DbContext をすべてのレポジトリで使用できます。大したことはありません。短所: * 起動時にのみ機能します (つまり、新しいモジュールを追加するには、AppPool の更新が必要になります)。* CodeFirst は POC に最適です。しかし、EF5 では、エンタープライズ向けの作業にはまだ十分に成熟していません(そして、StoredProcs やその他の機能が追加される EF6 が待ちきれません)。* 私の DBA は CodeFirst を嫌います。少なくとも Core については、可能な限り Stored Procs でその部分を最適化したいと考えています...私たちはチームなので、できれば彼を喜ばせる方法を見つけなければなりません方法を見つける...
データベースファースト:
DbModel フェーズは、DbContext のコンストラクター (埋め込まれた *.edmx リソース ファイルからの読み取り) の前に発生しているようです。DbInitialization が呼び出されることはありません (モデルが完全であると見なされるため)。そのため、コアが認識している以上のテーブルを追加することはできません。
CodeFirst でできるように、動的にモデルに要素を追加できない場合は、コア DbContext のモデルが Db 内のすべてのテーブル (コアおよびすべてのサードパーティ モジュール) の知識を持っている必要があることを意味します。アプリケーションをモノリシックにして高度に結合し、まさに私が達成しようとしているものを無効にします。* または、各サード パーティが独自の DbContext を作成し、Core テーブルをインポートする必要があり、* バージョン管理の問題 (コアの *.edmx が更新されたときにモジュールが *.edmx を更新しないなど) * どこでも、異なるメモリ コンテキストでの重複 = ハード並行性の問題を追跡します。
現時点では、CodeFirst アプローチが、モジュラー ソフトウェアを EF で実現できる唯一の方法であるように思えます。しかし、他の誰かが DatabaseFirst を輝かせる方法を知っていることを願っています。埋め込まれた *.edmx ファイルから作成されたモデルに DbSet を「追加」する方法はありますか?
または他のアイデアはありますか?