私はエンティティフレームワーク4、WCFおよびSilverlightを使用しています。既存の子を持つ新しいオブジェクトを追加すると複製されます
私は商品に対する注文の多面的な関係があります。
[Order]*--*[Product]
最初にモデルを使用すると、Entity Frameworkによって自動的に結合テーブルが作成されます。サーバー側ですべてを作成すると、問題は解決します。この問題は、Silverlightを使用するときに発生します。
商品のリストを戻して画面に表示します。ユーザは新しい注文を作成し、注文の一部でなければならない商品を選択する。その後、WCFに提出されます。サーバー側では
var order = new order();
order.CustomerName = customerTextBox.Text;
...
order.Products = new ObservableCollection<Product>();
foreach (var product in selectedProducts)
{
order.Products.Add(product);
}
var proxy = new OrderService();
proxy.CreateOrderAsync(order);
、それはしかし、奇妙な何かが起こるだけの非常にシンプルなaddメソッド
var db = new Model1Container();
db.Products.AddObject(order);
db.SaveChanges();
です。これが保存されると、データベース内のほとんどすべてが数回複製されます。私の推測は、Entity Frameworkが循環リンクを数回通過しているためです。
db.Categories.Attatch(order)に変更しようとしました。しかし、これは何も救われませんでした。 注文を保存する前に、それぞれの製品をループして手動で接続しようとしました。しかし、これは例外がスローされ、オブジェクトがすでにコンテキストにアタッチされていることを示します。
編集:はこれを行う製品が複製されて停止します。しかし、テーブルのすべての注文は依然として複製されています。まだすべての関係を横断している必要がありますか?
db.Orders.AddObject(order);
db.ObjectStateManager.ChangeObjectState(order, EntityState.Added);
foreach (var product in order.Products)
{
db.ObjectStateManager.ChangeObjectState(product, EntityState.Unchanged);
}
db.SaveChanges();
何も影響しませんでした。 OrderテーブルとProductテーブルのすべてがまだ複製されています –
私はあなたが提案したものを取り出し、それを少し拡張しました。今や製品は複製されませんが、テーブル内のすべての注文は依然として複製されます。 db.Orders.AddObject(order); db.ObjectStateManager.ChangeObjectState(order、EntityState.Added); foreach(順番に並んでいる製品。) { db.ObjectStateManager.ChangeObjectState(product、EntityState.Unchanged); } db.SaveChanges(); –
すべての注文をどういう意味ですか?あなたは単一の注文を挿入していますか? –