ここで私自身の痛みを生み出したと確信していますが、シナリオで新しいエンティティを作成するためのイベントの正しい順序を理解するのに苦労しています。
私のモデルには、ObjectAとObjectBの 2 つのオブジェクトがあり、どちらもBaseObjectから継承されており、明らかにそれぞれに独自の追加プロパティがあります。
私の見解では、ほとんどの情報は同じであるため、ユーザーが作成するオプションを選択できるようにしたいと考えています。そのため、SharedProperty1とSharedProperty2 (コレクション ナビゲーション プロパティ)に入力し、A または B オブジェクトが必要かどうかに関するオプションを選択し、最後のオブジェクト固有のプロパティを持つ最終ページに入力します。
ユーザーがこのオプションを選択するまで、どのエンティティを作成すればよいかわからなかったので、ビューモデルにオブジェクトを作成して、この一時データを処理しました。その一環として、SharedProperty2 (コレクション)に入力しているときに、新しいChildObjectsを追加するときに、entityManager.createEntity('ChildObject')
. 最後に達したら、ObjectAまたはObjectBエンティティを作成し、子エンティティ (およびその他のプロパティ) を追加してから、保存を試みます。
問題は、正しく保存されないことですが、どのアプローチを採用するかによって異なる結果が得られます。ユーザーは新しいオブジェクトのプロセスを中止するだけでよいので、私はChildObjectsを作成してEntityState.Detached
いました。この方法で作成されたすべてのエンティティが id キー 0 を取得することに気付きました。そのため、 ChildEntitesを親 ( ObjectAまたはObjectBのいずれか) に追加しているときに、減少する負の数 (つまり: -1) を割り当てることによってキーを修正しました。 、-2 など)。これにより、一部のエンティティのみがデータベースに保存され、外部キーが競合するという苦情が発生するなど、サーバー側の動作がおかしくなりました。
これもよくわからず汚してしまった悪臭がした。だから今、私はエンティティを通常どおりに作成しようとしました(つまり、Detached
フラグなしで)、それらはすべて独自の一意のキーを取得します(再びそよ風が-1、-2などに続くように見えます)が、今からそれらをコピーしようとすると一時的なビューモデル コレクションを親オブジェクト コレクションに追加すると、an entity with this key is already attached
. そのため、保存する正しいモデルを構築することさえできません。
これを処理する方法をまだ正しく理解していないと思うので、いくつかの指針をいただければ幸いです。
私が疑問に思っていることを回避するために、破棄されるエンティティを処理するために RejectChanges を使用しなかった理由を説明します。基本的に、ユーザーは ChildObject (オブジェクトは、breeze entityManager によって作成され、viewmodel コレクションに追加され、UI にバインドされます) を追加し、データを保存する前に、それを再度削除することを決定できます (現在は、viewmodel コレクションから削除されるだけです)。変更の拒否を使用した場合、他の重要なエンティティを破棄します。誰かがビューで ChildObject を削除した場合、私は今、良い子になり、適切な detach メソッドを使用すると思います。