11

アプリケーションで追跡したいさまざまなオブジェクトがあります。オブジェクトは、コンピューター、カメラ、スイッチ、ルーターなどです。さまざまなオブジェクトがデバイスと呼ばれるオブジェクトから継承されるようにしたいと考えています。なぜなら、それらはすべて共通のプロパティ (つまり、IP アドレス、MAC アドレスなど) を持っているからです。オブジェクトを作成するのが好きです。デザイナー(モデルファースト)を使用していますが、モデルからデータベースを更新するのが難しいのは好きではありません。基本的に、データベースを削除して再作成する必要はありません。特に、データベースへのデータの入力を開始した場合は特にそうです。私が実験したもう 1 つのアプローチは、SQL Server で SSMS を使用してデータベースを作成することでしたが、データベースから POCO を作成すると、エンティティは相互に継承されません。私の状況に適したアプローチは何ですか?

4

1 に答える 1

15

さまざまなオブジェクトが Device というオブジェクトから継承されるようにしたいのは、すべてのオブジェクトに共通のプロパティ (IP アドレス、MAC アドレスなど) があるためです。

基本的に、EF で使用する継承パターンについて話しているのです。または、モデルがデータベース テーブルにどのようにマップされるか。EF には主に 3 種類の継承パターンがあります (「継承マッピング: 初心者のためのウォークスルー ガイド」を参照)。

  • 階層ごとのテーブル
  • タイプごとのテーブル
  • テーブルパーコンクリートタイプ

それぞれに長所と短所があります (パフォーマンスなど)。ただし、このモデルはデータベースに関連するモデルであることも考慮する必要があります。大規模なプロジェクトでは、ビジネス ロジックを操作するための 2 番目のレイヤーを作成する場合があります。DDD は持続性モデルとドメイン モデルについて語っています。繰り返しますが、ここでの選択は、開発の初期速度、スケーラビリティ、およびその後のパフォーマンスを重視しています。

デザイナー (Model First) を使用してオブジェクトを作成するのは好きですが、モデルからデータベースを更新するのが難しいのは好きではありません。

EF には 4 つの開発戦略があり、その 4 つだけです (「Entity Framework 開発ワークフロー」を参照)。

データベースを削除して再作成する必要はありません。特に、データベースの作成を開始した場合はなおさらです。

Code First は、次の点で非常に優れています。

  • Code First でシード処理を行うと、デプロイ先に応じて、データベースにテスト データまたはライブ データを入力できます。
  • 移行により、データベースに対して非破壊的な更新を行い、完全にテスト可能で信頼性の高い方法でデータを移行して、ライブ展開を行うことができます。

Model First でこれを行うのは、残念ながら難しいことです。私が知っている唯一の実際の解決策は、新しいデータベースを生成し、SQL 比較 (データ比較付き) ツールを使用して新しいデータベースにデータを生成することです。

パターンと戦略の選択

各戦略には長所と短所があり、各継承パターンは特定の開発戦略で使用する方が適しています。たとえば、継承した既存のデータベースがある場合は、データベース ファーストを使用する必要があるかもしれません。または、EF デザイナーを使用したほうがよい場合は、モデル ファーストを使用することもできます

Model First (つまり、EF デザイナーを使用してモデルを定義することを意味します) では、既定で TPT 戦略が使用されます。EF デザイナーの TPT 継承を参照してください。TPH が必要な場合は、モデル ファーストを使用できます (「EF デザイナーの TPH 継承」を参照)。ただし、追加の作業が必要です。Code First は TPH に適しています。Model First を使用すると TPC はさらに難しくなり、EF 5 では Code First が実際に最適な (実行可能な唯一の) オプションです。

データベースから POCO を作成すると、エンティティが相互に継承されません

モデルがクラスを扱うことを覚えておくとよいでしょう。データベースはテーブル内のストレージを扱います。データベースからモデルを生成するとき、EF が TPH または TPC の継承がどうあるべきかを判断するのは困難です。できることは、テーブルの関連付けに基づいてモデルの「最良の推測」を作成することだけです。プロパティの名前を変更したり、関連付けを変更したり、継承を適用​​したりして、モデルが生成された後にそれを支援する必要があります。これを行うには他に方法はありません。したがって、データベースを更新するには、モデルでさらに作業が必要になる場合もあります。

あなたの最善のアプローチ

残念ながら、それは意見次第です。ただし、主な要件が次の場合:

  1. TPH または TPC (または混合戦略) が必要
  2. モデルに更新を発行するときにデータベースを削除したくない

これらの技術的要件に最適なのは、移行とシードを伴う Code First 開発です。

Code First の欠点は、独自の POCO を作成する必要があることと、データ注釈属性を学習することです。ただし、次の点に注意してください。

  • POCO の作成は、データベース テーブルの作成とそれほど違いはありません (慣れれば、同じくらい簡単です)。
  • Code First は、自動化されたテスト (たとえば、DI および/または IoC を使用してデータベースを使用せずにテストする) ではるかに使いやすいため、後で利点が得られます。
  • 最初にデータベースで多くの EDMX 操作を行う場合、または最初にモデルを使用してデータベースを削除して更新するたびに多くの作業を行う場合は、POCO を記述する代わりに他の場所に時間と労力を費やしています。
于 2013-05-18T18:47:55.230 に答える