3

STEを使い始めた MVC2 アプリがあります。更新がどのように機能するかについての明確化を探しています。

バックグラウンド:

関連カテゴリ エンティティと関連投稿/コメント エンティティを含むブログ エンティティがあるとします。MVC では、メインのブログ エンティティとカテゴリを含むビューをレンダリングしていますが、関連する投稿はレンダリングしていません。ブログ エンティティをサーバーにポストバックすると、関連するカテゴリは表示されますが、サーバーにシリアライズされるエンティティの投稿は表示されません (ビューに表示されていないため)。また、ブログ エンティティの変更状態は「追加済み」です。

次に、このブログ エンティティを呼び出して更新を実行しようとしApplychanges()ましSaveChanges()たが、投稿との FK 関係と、データベースに関連する投稿があるが、返信しているエンティティに関連付けられていないという事実のために失敗します。

さらにテストを行って... サーバーに接続しているときに (状態 = 変更なし)、ブログ エンティティの現在のインスタンス (関連するすべての FK エンティティを含む) を取得し、プロパティを変更 (状態 = 変更済み) して更新すると、期待どおりに動作します。 .

私の質問: ビューにレンダリングされていない関連エンティティがあり、そのためブログ エンティティでポストバックされない場合、更新は機能するはずですか?

ブログ エンティティが「変更済み」ではなく「追加済み」ステータスのポスト バックを取得するのはなぜですか? 変更されたすべてのエンティティに対して「変更された」変更状態が返されると想定し、ApplyChanges/SaveChanges()変更されたアイテムのみを呼び出すと更新が試行されるため、関連するすべてのエンティティは必要ありません。

クライアントからエンティティを直接渡すことができるようにする必要がありますか、ApplyChanges()/SaveChanges()またはエンティティをサーバーにポストバックし、データベースから既存のコピーを取得し、そのコピーに変更を適用して、既存のオブジェクトをポストバックする必要がありますか?

4

4 に答える 4

1

これに関する私の観察では、EF4 の STE はクライアントがステートフルな状況ではうまく機能しますが、ステートレス環境では期待どおりに機能しません。

MVC はこの欠点を強調しています。たとえば、典型的なエンティティ「User」と、典型的なシナリオ、EditController および Edit ビューを見てみましょう。

データベース (ユーザーの取得、トラッキングの開始、リターン) またはサービス (逆シリアル化後に変更のトラッキングが自動的にオンになる) にアクセスすると、エンティティはコントローラーとビュー内で期待どおりに動作します。

ただし、Post が戻ってくると、Controller メソッドが取得するエンティティは新しいエンティティであり、Get リクエストで渡されたエンティティではありません。したがって、このエンティティには変更追跡がなく、Added 状態にあり、Get フェーズで渡されたのと同じインスタンスとして扱うと、データベースが爆発します。

現在、EF4 STE を変更済みとしてマークし、変更を適用して、エンティティが本当に新しいか、誤って追加済みとしてマークされたときに保存することができます。このシナリオをサポートするために現在できることは、これでほぼすべてです。MVC チームが STE をサポートするためのより良いパターンを考え出さない限り、またはモデルをインスタンス化してエンティティ インスタンスをキャッシュするときにモデル バインダーのデフォルトの動作を変更しない限り...

于 2010-04-05T15:16:01.400 に答える
0

私は、STE が現実の世界に対応する準備ができていないと言ったことはないと思います。それらは万人向けではありません。これらは、簡単に機能するものを求めているだけのデータセット/データテーブル ユーザーにとって非常に優れたツールです。これらのユーザー (そして、そこには多くのユーザーがいます) にとって、クライアント アプリに STE エンティティを配置することは悪いことではありません。彼らはおそらくすでにパイプの両側を所有しています。

于 2010-02-10T14:12:24.553 に答える
0

非常によく似た問題、つまり周辺の更新に苦労しました。収集した情報に基づいて、STE は製品化の準備ができていませんが、使用することを検討しました。

とにかく、ここでの問題は、アタッチとデタッチの違い、および ObjectStateManager と STE の間の相互作用に集中しています。 STE 動作を使用します (これは、クライアントに逆シリアル化された後にのみ発生するか、接続されたエンティティに再接続されます)。

追加されたものとして表示される理由への回答:

たとえば、STE がインスタンス化されると、変更の追跡が無効になり、変更トラッカーのデフォルトの状態が [追加済み] になります。

これはすべて混乱を招くものであり、Julia Lerman へのインタビューやオンラインの投稿は、現在の STE リリースが現実の世界に対応する準備ができていないことを示しているようです...

Diego Vega (EF チーム) からのこの応答を参照してください。

このモードで STE を使用すると、STE はプレーンな POCO オブジェクトとほぼ同じように動作します。たとえば、グラフを直接操作するか、ObjectContext および ObjectStateManager で API を使用できます。また、SaveChanges を呼び出す前に、DetectChanges を呼び出して、状態マネージャーがグラフと同期していることを確認する必要があります。

最も重要なことは、標準のオブジェクト サービス API は STE を認識しないため、AcceptAllChanges などのメソッド (例では SaveChanges 中に暗黙的に呼び出され、苦情オブジェクトの ObjectStateManager 状態を Unchanged にリセットするもの) はまったく影響を与えません。 STEによって保存された状態。

http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/557e6db0-51df-45e5-a2e9-c31995969554

お役に立てれば

于 2010-01-22T17:11:37.470 に答える