私の意見では、EDMXを使用したEFは、このシナリオに対応する準備ができていません。理由を明確にしましょう:
- EDMXは、デザイナーが使用するファイルです。実行時に、EDMXファイルから生成された3つのXMLファイル(SSDL、MSL、およびCSDL)が必要です。これらのファイルはモデルを定義し、エンティティ接続文字列の一部です。
ObjectContext
これらのファイルで提供されるエンティティでのみ機能します。
- 標準的なアプローチは、接続/コンテキストごとにこれらのファイルの単一のセットです。標準的なアプローチに従うと、テーブルの追加はこれらのXMLファイルの変更を意味するため非常に困難です(これらのファイルを個別にデプロイするアプローチを使用する必要があります-デフォルトのアプローチでは、これらのファイルをデータアクセスアセンブリ内のリソースとして使用します)。
- EFをハックして、単一の接続ごとに複数のファイルを許可する方法を説明しましたが、お勧めしません。
- メタデータファイルの個別のセットを作成する場合、新しいエンティティ(別の接続文字列)を操作するために別のコンテキストインスタンスが必要になり、これら2つのコンテキストはお互いを認識せず、他のエンティティにマップされたエンティティを使用できなくなります。
- マッピングは話の一部にすぎません。次に、アプリケーションでエンティティを表すクラスが必要です。開発のためだけにこの「動的」な動作が必要な場合は問題ありませんが、実行時またはアプリケーションのリロード時にモデルにテーブルを追加するのは方法ではないようです-ORMツールでモデルを定義するのは実行時ではなく設計時です=必要です新しいエンティティを使用してアセンブリをコンパイルしました。これらの新しいエンティティを使用し、新しいアセンブリを参照するコードが必要です。
DefiningQuery
は単なるデータベースクエリです。EFはこのクエリの結果セットにのみ関心があるため、データベース(または別のデータベース)に存在する任意のテーブルを使用できます。
最初にコードを使用すると、開発エクスペリエンスが大幅に向上します。コードは最初にEDMXファイルを必要としません-それはコードによって定義されたマッピングを使用します。EntityTypeConfiguration<>
ブートストラップで事前定義された(または参照されたすべての)アセンブリから派生したすべてのタイプを収集するために、アプリケーションが必要になります。これらの構成はすべて、最初のコンテキストインスタンスを作成するときにに追加さDbModelBuilder
れます。OnModelCreation
アプリケーションを再起動し、エンティティを使用して新しいアセンブリを展開した後、新しいエンティティを簡単に使用できるコンテキストが得られます。それでも、このエンティティを使用するにはコードが必要です。DbSetを呼び出すことによってコンテキストクラスのプロパティとして公開するのではなく、手動で作成する必要がありますcontext.Set<EntityType>()
。エンティティモデルの検証とデータベースの再作成をオフにする必要があり、すべてを自分で同期させる必要があるため、最初にコードでこれを行う場合には、いくつかの落とし穴があります。
それでも、新しいアセンブリをデプロイし、アプリケーションを再起動するとアセンブリを使用するシナリオについて説明しています。アプリケーション自体からテーブルと「エンティティ」を管理する必要がある場合は、ORMを直接使用するシナリオではありません。これは一部のメタデータモデル/マルチテナントシナリオの場合であり、ORMが一部の一般的な抽象テーブルに使用され、実際のエンティティが抽象として保存されたメタデータから構築されるというまったく異なる方法で行われます。