0

コードファーストとエンティティフレームワークを使用してデータベースを作成しています。うまく機能するすべてのモデルを定義していますが、ブロックを含めることができるPageクラスができました。これらのブロックには、ID、BlockType、Position、Nameなどの基本クラスがありますが、この基本クラスから継承するクラスである、さまざまなプロパティを持つさまざまなタイプのブロックがあります。カスタムプロパティをコンマ区切りのリストなどに保存せずに、ページに「ブロック」のコレクションを含めることができるように、モデルを設定するにはどうすればよいか疑問に思っています。出来ますか?そして、これをモデル化するための「良い」方法は何ですか。

前もって感謝します!

4

1 に答える 1

1

EntityFrameworkは継承をサポートしています。オブジェクトモデル(基本クラスと派生クラス)をデータベーススキーマにマップするには、さまざまな戦略があります。最も重要なものは次のとおりです。

  • 階層ごとのテーブル(TPH):基本クラスとすべての派生クラスがデータベース内の単一のテーブルにマップされます。派生クラスのカスタムプロパティはテーブルに個別の列として表示され、テーブルにはタイプを区別するための識別子列が含まれます。EFは、特定のタイプを具体化するために必要な列をロードすることに成功しました。

  • タイプごとのテーブル(TPT):基本クラスには、基本クラスのプロパティのみを含む独自のテーブルがあります。すべての派生エンティティは、このタイプの追加のプロパティを持つ別のテーブルを取得します。EFは、特定のタイプを具体化するためのすべてのプロパティを含むさまざまなテーブルからプロパティをロードする(適切な結合を作成する)ことができます。

TPTは、私の意見では、継承を実装するためのよりクリーンなアプローチですが、現在(EF <= 4.3)EFによって生成されるSQLが最適ではないため、TPHと比較してパフォーマンスの問題があります。この問題はEF5.0で解決されます。ただし、TPHは複数のテーブルを結合する必要がないため、引き続きよりパフォーマンスの高いマッピング方法を維持します。

戦略の長所と短所については、リンクされたブログ投稿で詳しく説明されています。ブログには、3番目の(あまり使用されない)オプションであるコンクリートタイプごとのテーブル(TPC)もあります。

于 2012-04-26T15:48:58.547 に答える