これは明らかに何度も議論されてきたトピックですが、ここでの私のアプローチの角度は少し異なります. 私が理解している限りでは、STE は POCO と見なされます (決して EF dll に関連付けられていません)。独自の変更追跡を処理するための追加の「もの」が内部にあるだけです。次のアプリケーション層を想定しています。
Proj.Web
Proj.Business
Proj.Model
Proj.DataAccess
必須ではなく、2 層のセットアップで実行していると仮定するとlazy loading
、STE と POCO の使用に違いはないと私は理解しています。私たちは Web 上にいて、接続されていない環境であるため、選択肢は で追加の SQL クエリを実行するPostback
か、エンティティをアタッチして、必要に応じてプロパティを変更するように設定する必要があります。繰り返しますが (間違っている場合は訂正してください)、コードは同じように見えます。
簡単な例を考えてみましょう。Web フォーム アプリケーションでポストバックを処理しています。
Person p = PersonManager.GetById(2); //we use the "requery" method
PersonManager.Update(p);
//If we dig into PersonManager.Update() we'll see the following:
PersonRepository.ApplyChanges(p); //we're assuming STEs are used so this API is available
PersonRepository.SaveChanges();
後で、Proj.Business と Proj.Web の間に WCF トランスポート層を導入して、アーキテクチャを 3 層に昇格するように求められたとします。これを Proj.Services と呼びましょう。最初から STE を使用していた場合、はるかに優れた状況にあるのではないでしょうか? ビジネス レイヤーやリポジトリを変更することなく、呼び出しをビジネス レイヤーに転送するだけで済みます。
PersonService.Update(Person p)
{
PersonManager.Update(p);
}
たとえば、POCO を使用している場合 (スナップショットを想定してみましょう)、このエンティティがコンテキストに既に存在するかどうか (2 層を実行している場合) を確認し、存在しない場合 (3 -tier) それをアタッチし、そのプロパティを変更済みに設定します。将来的に 3 層ソリューションが必要になるかどうかわからない場合は、さらに多くの作業が必要になるようです。一方、最初から STE に対してコーディングしていた場合、余分に不要な (実際には何も害を与えない) コードは、ApplyChanges() の呼び出しだけです。それ以外の場合は、何も失うことはないと思います (遅延読み込みは必要ないと仮定します)。この件についてどう思いますか。