まず、エンティティフレームワークのコードを使用して、northwindデータベースをWCF REST HTTPインターフェイスで公開しています。エンティティグラフを再接続してコレクションの変更を検出する
私はOrderDetailsテーブル(注文アイテム)を公開していません。注文を作成してから、必要なOrderDetailを別のサービスに別々に追加することは意味がありません。私の考えでは、成功するか失敗するかのどちらかの原子的なトランザクションである必要があります。したがって、クライアントに渡すときにOrder.OrderDetailsコレクションを含め、注文が作成または更新されたときに取得すると仮定します。
しかし、問題は、更新のOrderエンティティを再接続するときに、OrderDetailsコレクションの変更を検出しているようです。オーダー自体は、これらのプロパティーを更新するために変更されたものとして設定できますが、これはOrderDetail項目にカスケードしません。だから私は手動で行って、更新されたものを修正するように設定することができますが、問題は最初に更新されるものを見つけることにあります。新しいOrderDetailを変更すると、保存しようとするとエラーが発生します。
新しいコレクションアイテムのIDを0に設定するという推奨事項を読んで、サーバーでそれを使用して新しいコレクションアイテムが存在するかどうかを判断します。ただし、NorthwindはOrderDetailsにOrderIDとProductIDの複合キーを使用します。これらは両方ともクライアントによって設定されなければならないので、私は新しいものを検出する方法を見つけることができません。さらに、削除されたOrderDetailは切り離されたグラフには存在しないので、削除されたものを見つけ出し、明示的に削除する必要があります。
アドバイスをいただければ幸いです。
public override Order Update(Order entity)
{
dbset.Attach(entity);
DataContext.Entry(entity).State = EntityState.Modified;
foreach (var orderDetail in entity.OrderDetails)
{
DataContext.Entry(orderDetail).State = EntityState.Modified;
}
return entity;
}
偉大な答えです。時間をいただきありがとうございます! –
EFチームがエンティティグラフを添付してもう少し自動化するシナリオを追求しないことにした理由を考えていないとしますか?私はそれがクライアントが更新することを望んでいないと考えていると思っています。Order in Product - OrderItem - Productシナリオを言います。 –
私はこの問題についてもっと考えるほど、完全な自動化は不可能であるか信頼性がないと信じています(信頼性は正確に記述したもので、自動更新によって変更したくないエンティティが変更される可能性があります)。 –