3

エンティティは永続的に無知であるべきですか? Microsoft ADO.NET Entity Framorwok はどうですか? しつこい無知ですか?

4

3 に答える 3

3

Entity Framework は、永続性を無視するエンティティと永続性を認識するエンティティの両方をサポートします。

以前の回答では、これは使用する生成パターンによるものであることが示唆されています。これは歴史的には (偶然にも) 真実でしたが、もはやそうではありません。コード ファーストとデータベースの最初の生成パターンの両方で、永続性を意識する (っぽい) または永続性を無視することを選択できます。

EF で永続性を無視するかどうかの決定は、変更の追跡の問題です。つまり、エンティティに発生している変更をどのように検出し、これらをデータベースに永続化するために必要なアクションを決定するかです。EF には 3 つの主な変更追跡方法があります

  • スナップショットの追跡 (エンティティは完全に永続性を無視します)
  • POCO プロキシの変更追跡 (エンティティは永続性を無視しているように見えますが、舞台裏では永続性を認識しています)
  • 非推奨になったセルフ トラッキング エンティティ (STE) (エンティティは永続性に対応しています)

永続性の無視とは、エンティティがデータベース テーブルにマップされていることを明示的に推測せずに、エンティティがどのように見えるかを説明できるようにすることです。これは、特定のデータベースの実装にあまり厳密に縛られていないことを意味します。ただし、永続性を無視すると、データベースとの効率的な通信方法に関していくつかのトレードオフが生じます。

エンティティが永続性を完全に無視している場合は、フレームワークがいつ変更され、変更がデータベースに何を意味するかを理解するために、フレームワークにさらに多くの作業を行わせる必要があります。エンティティ フレームワークでは、これまでにコンテキストによって追跡 (表示) されたすべてのエンティティのコピーを並べて保存し、変更を検出するために diff を実行することによって実現されます。

POCO プロキシを使用して、元のエンティティのモック拡張を作成し、特定のプロパティの操作をリッスンして、変更をより効率的に追跡できるようにします。

EF チームは、スナップショット変更トラッカーで非常に素晴らしい仕事をして、完全に永続性を無視したエンティティを使用できるようにしました。これは、小さなコンテキスト (一度に 1,000 個未満のオブジェクトを追跡する場合) では非常にうまく機能しますが、これがおそらく私たちの使用法に合わない場合には、別の追跡方法が提供されています。

純粋な POCO エンティティとスナップショット トラッキングを使用しても、SQL テーブルへのマッピングの正確な詳細を構成するために属性装飾を使用するか、モデル ビルダーを使用するかによって、さまざまなレベルの永続性無視があります。これは、私が属性の装飾よりもモデル ビルダーを使用することを好む主な理由の 1 つです。

あなたのタイトルの質問「エンティティは永続的に無知であるべきですか?」に対する答えとして。私の意見は、理想的にはイエスですが、それが実際に理にかなっている場合に限られます。

于 2012-12-22T00:38:10.913 に答える
0

一般的に言えば、エンティティ オブジェクトは単純なデータ ホルダーである必要があります。彼らは、データがどこから来て、どのように取得され、どこへ行くかを気にする必要はありません。彼らの仕事は、関連するデータ ポイントのセット (必要に応じてレコード) のコンテナーです。通常、他のオブジェクト (データ アクセス オブジェクト) があり、そのジョブは、データを取得してエンティティ オブジェクトに入力するか、エンティティ オブジェクトを取得してそのデータをデータ ストアに保存します。

于 2012-12-21T14:42:32.650 に答える
0

EF はストレージ システムに依存しません。必要に応じて、独自のプロバイダーを作成できます。たとえば、メモリ ベースのストレージ モデル。EF が期待するプロバイダー モデルがあります。
http://msdn.microsoft.com/en-us/library/ee789835.aspx

于 2012-12-21T14:21:42.390 に答える