2012-03-18 6 views
3

このプロジェクトでは、Entity Framework Code Firstを使用しています。非常にシンプルなPOCOがデータベース内の多くのテーブルを表す場合があります。これは、SQL Azureの水平パーティショニング戦略の一部です。 SQL Azureはファイルグループをサポートしていないため、一般的なパーティショニングはサポートされていません。非常に多数のテーブルが存在するため、UNION ALLビューを基本ビューのCHECK CONSTRAINTを介してパーティションビューとして使用することは実現できません。Fluent APIのマッピングを動的に変更します

したがって、実行時に必要に応じてマッピングを実行することをお勧めします。ただし、これは、

modelBuilder.Entity<EntityName>().ToTable("foo", "bar"); 

のようなコードを介してDbContextクラスのOnModelCreatingイベントで発生します。工場内でこのマッピングを実行することは可能でしょうか?我々は、Factoryにメタデータを供給し、ModelBuilderを介してPOCOとテーブルとの間に1対1のマッピングを持たせるのではなく、Fluent APIを使用することを好むでしょう。

+0

あなたが求めるものは不明です。あなたは 'OnModelCreating'で常にマッピングを作成するカスタムコードを持つことができます。 –

+0

私はOnModelCreatingで定義したくありません。私は1つのクラスを持ち、そのクラスを同じスキーマを持ついくつかのテーブルに動的にマップできます。 OnModelCreatingでそれを行うと、私はそのオプションがあるとは思わない。 OnModelを使用すると、1つのテーブルのみにマップできます。 –

答えて

5

DbContext派生物にコンストラクタを追加できます。コンストラクタには、テーブル名とメタスケア名の2つの文字列引数があります。メンバー変数に名前を格納し、ToTableメソッドで使用することができます。

DbModelが実際に必要なときに作成されるため、コンストラクタは常にOnModelCreatingイベントの前に実行されます。 (これは派生クラスでは必ずしも当てはまるわけではありませんが、それは別のトピックです)。

最適化として、DbModelをコンパイルしてキャッシュし、DbContextthe constructor accepting a DbCompiledModelでビルドすることができます。

+0

私はこの考えが好きです。ありがとうございました。複数のエンティティのカスタムマッピングが必要な場合はどうすればよいですか? Dictionaryとしてを渡して、すべてのマッピングを含み、EntityNameをキーとして使用し、TableNameを値として使用するとします。あなたの考え? –

+0

確かに、そうすることができます。より安全な型にするために 'Dictionary ' –

+0

ニース!ありがとう。私はこの糸を少し煮るようにして、何が発展するのか見てみましょう。私はあなたの答えが好きです。 –

関連する問題