1

このトピック (実行時に Entity Framework モデルを変更する) についてはかなりの議論がありましたが、これまでのところ、問題に対する優れた解決策を見つけることができませんでした。現在、EF 4.0 で構築されたモデルがあり、顧客がさまざまなテーブルにカスタム フィールドを追加できるようにする必要があります。現在、新しいプロパティを説明するいくつかの一般的な表で問題を解決していますが、解決策がうまく機能していないことがわかりました。

データベースに列を動的に追加し、実行時にそれを反映するように ORM を更新する良い方法を知っている人はいますか?

4

1 に答える 1

2

データベースの変更を反映するために、実行時に EF を更新するための優れた、優れた、または管理しやすい方法はありません。実行時に変更する必要があるデータベースが実際にある場合、EF は適切なツールではありません。EF は厳密に型指定されています。データベースへのすべての変更は、マッピングだけでなく、データの読み込みと永続化に使用されるエンティティ クラスにも反映する必要があります。

実行時にエンティティ クラスを変更すると、常に実行時に IL コードを発行する領域に移動します。動的モジュールと動的エンティティ タイプを使用して動的アセンブリを作成するプロセスに合格すると、多くの新しい課題に直面することになります。

  • 既存のタイプは変更しません。ユーザーがプロパティを追加または削除するたびに、新しいタイプを生成します。
  • 新しい型の生成は、コンテキストのメタデータ ワークスペースを再構築するための新しいパフォーマンス コストをもたらします。サーバーで使用する場合は、これが正しく同期されていることも確認する必要があります。もう 1 つの問題は、(プロパティを追加または削除する前の) 古い型のすべての既存のインスタンスが、EF コンテキストの新しいインスタンスに認識されず、永続化できないことです。それらも永続化する場合は、古いメタデータ ワークスペースを含む EF コンテキスト インスタンスも必要です。
  • コードの多くは、dynamic実際の型の代わりに使用する可能性があります = コンパイル時のチェックなし。継承をマップする必要があり (不要)、インターフェイスが EF によって受け入れられないため、EF と直接対話する場合、継承とインターフェイスは役に立ちません。
  • 新しい型は設計時には不明です。設計時のコードとコンパイルには使用できません。
  • EFは好きではないdynamicExpandoObject、マッピングにリフレクションを使用しているため->実行時に動的インスタンスは正しいタイプである必要があります。そうしないと、リフレクションが機能しません。
  • 動的型のクエリを作成する方法は? クエリは常に、具体的な型のジェネリック インスタンスDbSetまたはObjectSet作成されたインスタンスから開始されます。これらのインスタンスも動的に作成できる必要があります。ジェネリック引数は、現在のコンテキストにマップされた型である必要がありますdynamic。この場合、マップされた型ではないため役に立ちません。
  • .NET には、この場合の適切な動作があります。アセンブリをアンロードできません。したがって、新しいタイプを生成するたびに、古い時間もロードされます。

実行時に EF を変更しますか? あなたの現在のアプローチは正しいものです。パフォーマンスが向上するように調整するだけですが、これらの要件には常にパフォーマンス コストが伴うことに注意してください (特に EF の場合)。

または、リンクされたテーブルで言及された最後のアプローチを使用します-メインエンティティで直接定義済みのカスタムフィールドの数を固定します。

于 2012-07-02T13:30:37.800 に答える