2

これは一般的なアーキテクチャに関する質問です。できれば、最終的なアプリケーションで EF を既に使用している人々に向けて説明します。

典型的な N 層アプリケーションがあります。

  • WPF クライアント
  • WCF サービス
  • EF STE DTOの
  • EF データ層

アプリケーションは、ロード時に (ユーザーのログインと同時に) 既知のすべてのビジネス タイプをロードし、オンデマンドで非常に大きな「ワーク バッチ」をロードします。このバッチは約 4 ~ 8Mg で、1,000 を超えるビジネス オブジェクトで構成されています。この「バッチ」の読み込みが終了したら、すべてを以前に読み込まれたビジネス タイプなどにリンクします。

最終的に、メモリ内に約 2,000 ~ 5,000 のビジネス オブジェクトがすべて正しく参照されるため、クライアント側で LINQ を使用および悪用できます。また、クライアント側でこれらすべてのオブジェクトに対して複雑な計算を行うため、実際には大きなグラフが必要です。 .

問題は、変更をデータベースに保存するときに発生します。このような大きなオブジェクト グラフでは、ネットワークを介してすべてを再送信することはほとんどありません。

これまでの T4 テンプレートの複雑さを考えると、私が嫌いな現在のアプローチは、更新時にすべてをデタッチしてアタッチすることです。基本的に、特定のオブジェクトを更新し、グラフの残りの部分から切り離し、ネットワーク経由で送信し、WCF 側で更新してから、クライアント側で再度アタッチします。主な問題は、リンクされたオブジェクトを更新したい場合です。たとえば、追加されたものへの参照を持つものを追加し、次に変更されたものへの別の参照などを追加するとします。何も壊さないでください。

これはすべて生成されたコードで行われるため、テンプレートごとに 200 ~ 800 行の T4 コードについて話していることになります。

私が今検討しているのは、STE のシリアライゼーションとデシリアライゼーションをカスタマイズする方法です。これにより、ネットワーク経由で送信されるものと送信されないものを制御し、単一の STE だけでなくバッチを更新できるようになります。参照をチェックして、それらの参照が変更されていないかどうかを確認します。そうでない場合はシリアライズしないでください。はいの場合は、WCF 側のコンテキストにアタッチするだけで、すべてをシリアライズして更新します。

いくつかの研究の後、私はこの方法に対する2つの解決策を見つけました。

1 つは、カスタム DataContractSerializer を作成することです。

2 つ目は、EF によって作成された STE テンプレートを変更し、参照型ごとに生成する代わりに、KnownTypeAttribute をいじって、オブジェクトを検査し、変更されていないシリアル化参照のみをマークするメソッドを参照させることです。

  • 誰もこの問題に遭遇したことがありますか?
  • どのようなソリューションを使用しましたか?
  • 途中でどのような問題に遭遇しましたか?
  • 作成したテンプレートの維持はどのくらい簡単でしたか?
4

1 に答える 1

0

アプリケーションの設計全体はわかりませんが、通常、ワークバッチをサービスにロードしてからクライアントに送信して再生する場合、サービスレイヤーは何らかの形で不要に見え、データベースからデータを直接ロードできます (そして、はるかに優れたパフォーマンスが得られます)。計算の複雑さによっては、データベースで直接計算を行うこともでき、パフォーマンスが大幅に向上します。

グラフの一部のみを保存するアプローチは、STE コンセプトの乱用です。STE は、グラフをロードし、グラフを変更して、同じグラフを保存するという方法で動作します。読み取り用に大きなデータセットを持ち、小さなチャンクのみを保存したい場合は、読み取り用にデータセットをロードし、チャンクを更新することに決めたら、チャンクだけを再度ロードし、変更して送り返す方がおそらく良いでしょう。

内部STEの動作を妨害することは、いくつかのコーナー/予期しないシナリオでいくつかの変更を失うための最善の方法です.

ところで。これはどういうわけか、ローカル データベースをグローバル データベースと同期するためのシナリオのように見えます。

于 2011-05-10T14:37:45.627 に答える