データベースの変更を反映するために、実行時に EF を更新するための優れた、優れた、または管理しやすい方法はありません。実行時に変更する必要があるデータベースが実際にある場合、EF は適切なツールではありません。EF は厳密に型指定されています。データベースへのすべての変更は、マッピングだけでなく、データの読み込みと永続化に使用されるエンティティ クラスにも反映する必要があります。
実行時にエンティティ クラスを変更すると、常に実行時に IL コードを発行する領域に移動します。動的モジュールと動的エンティティ タイプを使用して動的アセンブリを作成するプロセスに合格すると、多くの新しい課題に直面することになります。
- 既存のタイプは変更しません。ユーザーがプロパティを追加または削除するたびに、新しいタイプを生成します。
- 新しい型の生成は、コンテキストのメタデータ ワークスペースを再構築するための新しいパフォーマンス コストをもたらします。サーバーで使用する場合は、これが正しく同期されていることも確認する必要があります。もう 1 つの問題は、(プロパティを追加または削除する前の) 古い型のすべての既存のインスタンスが、EF コンテキストの新しいインスタンスに認識されず、永続化できないことです。それらも永続化する場合は、古いメタデータ ワークスペースを含む EF コンテキスト インスタンスも必要です。
- コードの多くは、
dynamic
実際の型の代わりに使用する可能性があります = コンパイル時のチェックなし。継承をマップする必要があり (不要)、インターフェイスが EF によって受け入れられないため、EF と直接対話する場合、継承とインターフェイスは役に立ちません。
- 新しい型は設計時には不明です。設計時のコードとコンパイルには使用できません。
- EFは好きではない
dynamic
かExpandoObject
、マッピングにリフレクションを使用しているため->実行時に動的インスタンスは正しいタイプである必要があります。そうしないと、リフレクションが機能しません。
- 動的型のクエリを作成する方法は? クエリは常に、具体的な型のジェネリック インスタンス
DbSet
またはObjectSet
作成されたインスタンスから開始されます。これらのインスタンスも動的に作成できる必要があります。ジェネリック引数は、現在のコンテキストにマップされた型である必要がありますdynamic
。この場合、マップされた型ではないため役に立ちません。
- .NET には、この場合の適切な動作があります。アセンブリをアンロードできません。したがって、新しいタイプを生成するたびに、古い時間もロードされます。
実行時に EF を変更しますか? あなたの現在のアプローチは正しいものです。パフォーマンスが向上するように調整するだけですが、これらの要件には常にパフォーマンス コストが伴うことに注意してください (特に EF の場合)。
または、リンクされたテーブルで言及された最後のアプローチを使用します-メインエンティティで直接定義済みのカスタムフィールドの数を固定します。