Entity Framework 4、POCOオブジェクト、およびASP.Net MVC2。私は多対多の関係を持っています。BlogPostエンティティとTagエンティティの間で言いましょう。つまり、T4で生成されたPOCO BlogPostクラスでは、
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
ObjectPostのインスタンスからBlogPostおよび関連するタグを要求し、それを別のレイヤー(MVCアプリケーションで表示)に送信します。後で、プロパティと関係が変更された、更新されたBlogPostを取得します。たとえば、タグ「A」、「B」、「C」があり、新しいタグは「C」、「D」です。私の特定の例では、新しいタグはなく、タグのプロパティは変更されないため、保存する必要があるのは変更された関係のみです。これを別のObjectContextに保存する必要があります。(更新:同じコンテキストインスタンスで実行しようとしましたが、失敗しました。)
問題:関係を適切に保存することができません。私は見つけたすべてを試しました:
- Controller.UpdateModelおよびController.TryUpdateModelが機能しません。
- コンテキストから古いBlogPostを取得してから、コレクションを変更しても機能しません。(次のポイントとは異なる方法で)
- これはおそらく機能しますが、これが解決策ではなく単なる回避策であることを願っています:(。
- 可能なすべての組み合わせでBlogPostやタグのAttach / Add / ChangeObjectState関数を試してみました。失敗しました。
- これは私が必要としているように見えますが、機能しません(私はそれを修正しようとしましたが、私の問題には対応できません)。
- ChangeState / Add / Attach / ...を試みましたが、コンテキストの関係オブジェクトです。失敗しました。
「機能しない」とは、ほとんどの場合、エラーが発生せず、少なくともBlogPostのプロパティが保存されるまで、特定の「ソリューション」に取り組んだことを意味します。リレーションシップで何が発生するかは異なります。通常、新しいPKを使用してタグがタグテーブルに再度追加され、保存されたBlogPostはそれらを参照し、元のPKを参照しません。もちろん、返されたタグにはPKがあり、保存/更新メソッドの前にPKをチェックします。それらはデータベース内のものと等しいため、EFはおそらくそれらを新しいオブジェクトであり、それらのPKは一時的なものであると考えています。
私が知っている問題で、自動化された簡単な解決策を見つけることが不可能になる可能性があります。POCOオブジェクトのコレクションが変更されると、FixupCollectionトリックが反対側の逆参照を更新するため、上記の仮想コレクションプロパティによって発生するはずです。多対多の関係の。ただし、ビューが更新されたBlogPostオブジェクトを「返す」場合、それは起こりませんでした。これは、おそらく私の問題に対する簡単な解決策はないことを意味しますが、それは私を非常に悲しくし、EF4-POCO-MVCの勝利を憎みます:(。これは、EFがMVC環境でこれを行うことができないことを意味しますEF4オブジェクトタイプが使用されます:(。スナップショットベースの変更追跡では、変更されたBlogPostが既存のPKのタグとの関係を持っていることがわかるはずです。
ところで、私は1対多の関係でも同じ問題が発生すると思います(Googleと私の同僚はそう言っています)。私はそれを自宅で試してみるつもりですが、それがうまくいくとしても、私のアプリでの6つの多対多の関係で私を助けません:(。