2

私は、エンティティフレームワークと自己追跡エンティティでWPFを使用する個人的なプロジェクトに取り組んでいます。CRUD操作のいくつかのメソッドを公開するWCFWebサービスがあります。今日、私はいくつかのテストを行い、実際にこのサービスを通過するものを確認することにしました。このようなことを期待していましたが、本当にがっかりしました。問題は、1つのオブジェクトのみの単純な更新(または削除)操作の場合です。たとえば、カテゴリIが、すべての親カテゴリ、そのアイテム、子カテゴリ、およびそのアイテムなどを含むオブジェクトグラフ全体をサーバーに送信するとします。私の場合、それは非常に小さなデータベース(2つの主要なカテゴリと約20の合計と約60のアイテム)上の170KBのxmlファイルでした。本当に大きなデータベースを持っているとどうなるか想像できません。

STEを使ったトラフィックの最適化に関する記事をグーグルで検索しようとしましたが、成功しなかったので、誰かが似たようなことをしたか、いくつかの良い習慣を知っているかなどをここで尋ねることにしました。

私が思いついた可能性のある方法の1つは、より多くのサービス呼び出しを使用して、オブジェクトごとに必要なデータを取得することです。

return context.Categories.ToList();//only the categories
...
return context.Items.ToList();//only the items

それ以外の:

return context.Categories.Include("Items").ToList();

このようにして、カテゴリとアイテムが分離され、変更を加えたり、一部のオブジェクトを削除したりするときに、ネットワーク経由で送信されるデータが少なくなります。

同様の問題に直面したことはありますか?どのように解決しましたか、それとも解決しましたか?

4

2 に答える 2

1

同様の課題に直面しました。まず第一に、あなたがすでに述べたように、エンティティを可能な限り小さく保つことです(必要なクライアント機能によって指示されます)。次に、エンティティをネットワーク経由で送り返して永続化する場合:変更されていないときにすべてのナビゲーションプロパティ(ネストされたオブジェクト)を削除します。これは非常に単純に聞こえますが、決して些細なことではありません。私たちが行うことは、「最上位」エンティティなどの追跡可能なコレクションに存在するエンティティ(およびそれらの追跡可能なコレクションとその...)を再帰的に掘り下げ、ChangeTracking状態が「Unchanged」のときにそれらを削除することです。ただし、これらのエンティティは削除されているか、親エンティティの追跡可能なコレクションに追加されているため、これらのエンティティが必要になる場合があるため、これには注意してください(したがって、削除しないでください)。

これは、私たちが「StripEntity」と呼んでいるものであり、JulieLermanの-ProgrammingEntity Frameworkでも言及されています(コードサンプルなどは含まれていません

また、より純粋な種類のアプローチほど効率的ではないかもしれませんが、STEを使用すると、データベースに対するクエリのコードを大幅に節約できます。トラフィックの多い状況で最適なパフォーマンスを実現する必要はないため、STEはニーズに適合し、データベースと通信するための多くのコードを削除します。あなたはあなたの状況のた​​めに「最良の」解決策が何であるかを決定しなければなりません。幸運を!

于 2011-06-29T21:55:02.567 に答える
1

EntityFrameworkプロジェクトアイテムはhttp://selftrackingentity.codeplex.com/にあります。バージョン0.9.8では、GetObjectGraphChanges()変更が加えられたオブジェクトのみを含む最適化されたエンティティオブジェクトグラフを返すというメソッドを追加しました。

また、2つのヘルパーメソッドがあります:EstimateObjectGraphSize()EstimateObjectGraphChangeSize()。最初のメソッドは、エンティティオブジェクト全体の推定サイズとそのオブジェクトグラフを返します。後者は、変更されたオブジェクトのみを含む最適化されたエンティティオブジェクトグラフの推定サイズを返します。これらの2つのヘルパーメソッドを使用して、呼び出すことが理にかなっているかどうかを判断できますGetObjectGraphChanges()

于 2011-09-29T13:48:53.117 に答える