0

私には単純な要件があります(だから私は思った...!)

Order、OrderLine、Productで構成されるモデルがあります。

Orderを作成し、OrderLines(製品に関連する各OrderLine)を追加したいと思います。Orderを作成し、それに新しいOrderLinesを追加します。投稿の合間に、OrderエンティティをSession(またはViewState)に保存します。ちょうどあなたが知っているように、私は正常に動作するバイナリシリアル化のサポートを追加しました。

したがって、関係はOrder> OrderLine(s)> Product(s)です。

問題が何であるかをすでに推測しているかもしれません-SaveChanges()を取得すると、通常の「オブジェクトのキー値がObjectStateManager内の別のオブジェクトと競合するため、AcceptChangesを続行できません」。エラー。

私はオンラインで多くの記事を参照しましたが、このケース(3つ以上のエンティティにまたがる関係がある場合)を処理しているようには見えません。例: http: //blogs.msdn.com/b/diego/archive/2010/10/06 /self-tracking-entities-applychanges-and-duplicate-entities.aspx

これは確かに非常に一般的な要件である必要がありますか?Entity Frameworkを使用して(DTOなどを使用せずに)同じようなことをしている人はいますか?

乾杯-助けて!:)

ニック

4

2 に答える 2

0

私はこれを「STEではない」とよく耳にしますが、なぜですか?WinForms、WPF、および ASP.Net コンポーネントを含む多層アプリがあり、すべてのレイヤーに STE を使用しています。ASP では、投稿/変更の間で STE を Viewstate\Sessionstate に適切に保持するだけで、コードは正常に動作するはずです。

問題のない多くのレベルの関係を持つエンティティがありますが、プリンシパルはレベル数に関係なく同じであるため、この例はほとんどありません。必要に応じてスクリプトを正しく作成する時間と忍耐力がある場合は、STE を使用し続けることをお勧めします。すべてのアプリケーションで使用する STE に基づく強固なフレームワークができました。

モデルと管理アプリが実際には .Net 4.0 の場合、STE を使用すると、SharePoint (.Net 3.5) のデータにアクセスできます。これは、STE と Entity Framework の見過ごされがちな利点の 1 つです。

特定の問題に関するヘルプについては、自己追跡エンティティ: ApplyChanges およびエンティティの複製 を参照してください。

于 2011-01-06T21:10:22.033 に答える
0

これが私がやろうと決めたことです...

注文を作成するには、EF で生成されたエンティティと関連付け (STE ではありません - あなたが正しいニックです) を使用します。常に外部キーを含めます。

MergeOption を NO TRACKING、つまりデタッチに設定します。

ユーザーが注文を作成している間、投稿/ページ要求の間に関連するエンティティを SESSION に保存します。

重要: 子エンティティ (OrderLines など) を関連付ける場合、既存の子エンティティをリレーションを通じて関連付けるのではなく、FK ID を使用します。したがって、OrderLine.Product = product は使用せず、OrderLine.Product_Id = product.Id を使用してください。これにより、異なるコンテキストから複数のエンティティが存在する問題が修正されます。

注文が完了し、保存する準備ができたら、コンテキストに追加して SaveChanges を実行します。

--

既存の注文を編集中...

MergeOption を NO TRACKING に設定します。

ユーザーが注文を編集している間、投稿/ページ要求の間に関連するエンティティを SESSION に保存します。

独自のエンティティ状態インジケーターを使用して、エンティティが切り離されたときに追加、変更、または削除されたかどうかを記録できるようにします。

編集が完了し、保存する準備ができたら、コンテキストにアタッチし、変更を処理し (ObjectState を MODIFIED に​​設定するなど)、SaveChanges を行います。

--

夢のように動作します - 短命のコンテキスト (UOW) - ビュー モデルや DTO はありません (エンティティ クラスを使用するだけです) - 複雑なコード (グラフのデタッチ/アタッチなど) はありません。

注: VIEWSTATE には保存されません。InProc から SQL に変更したいので、これを調べる必要があります。更新します。

多分私は何かを逃したかもしれませんが、私はこれに対する可能な解決策を研究するために多くの時間を費やしました.

于 2010-12-15T10:30:25.203 に答える