私は、モジュール式Non-Monolithicアプリケーションの設計でORM(この場合はEF5)を使用するアプローチについての提案を探しています。コアが第三者のモジュールを直接参照していないコアパートとサードパーティのモジュール、モジュールはコア/コモンテーブルとクラスのみを参照しています。EF:ModularアプリケーションのDatabaseFirst DbContextのデザイン戦略を検索しています
議論のために、十分に近似するのはDNNです。
CodeFirst:
CodeFirstでは、私が使用したアプローチは、DBのモデルを構築することでしたリフレクション経由したコアのDbContextのDbInitialation段階で、私は、任意のDLL内の任意のクラスを見つけるためにリフレクションを使用(例えばコアまたはさまざまなモジュール)をIDbInitializer(Execute()メソッドを含むカスタムコントラクト)で装飾して、DLLの構造だけを定義します。各dllはDbModelにそれ自体について知っていたものを加えました。 その後のシード処理も同じwaで処理されました(特定のIDbSeeder契約を検索して実行)。
プロ: *アプローチは今のところ動作します。 *同じコアDbContextは、各リポジトリがdbContextのプロパティであると予想するのではなく、dbContext.GetSet()を使用する限り、すべてのレポジトリで使用できます。いいえ。 短所: *起動時のみ動作します(つまり、新しいモジュールを追加するにはAppPoolを更新する必要があります)。 * CodeFirstはPOCに最適です。しかし、EF5では、エンタープライズワークのためにはまだ十分ではありません(StoredProcsのEF6やその他の機能が追加されるのを待つことができません)。 *私のDBAは、少なくともコアのために、CodeFirstを嫌い、できるだけストアドプロックスでその部分を最適化したい...私たちはチームなので、方法を見つけることができます...
データベース-最初:
DbModel相(組み込み* .edmxリソースファイルからの読み込み)前DbContextのコンストラクタに起こっているように見えます。 DbInitializationは決して呼び出されません(モデルが完全であるとみなされるため)、Coreが知っている以上のテーブルを追加することはできません。
CodeFirstでできるように、モデルに要素を動的に追加できない場合は、* Core DbContextのモデルがDb-Coreおよびすべてのサードパーティのすべてのテーブルの知識を持っている必要がありますモジュール。アプリケーションをモノリシックにし、高度に結合して、私が達成しようとしていることを打ち負かしてください。 *または各第三者はコアテーブルをインポートして *バージョン管理の問題(コアの* .edmxが更新されたときにモジュールが* .edmxを更新しない) *異なるメモリ内のすべての複製コンテキスト=同時実行性の問題を追跡するのは難しい。
この時点で、CodeFirstアプローチは、ModularソフトウェアをEFで実現できる唯一の方法です。しかし、うまくいけば、他の誰かがDatabaseFirstを輝かせる方法を知っているでしょう - 埋め込まれた* .edmxファイルから作成されたモデルにDbSetを「追加する」方法はありますか?
他のアイデアですか?