我正在使用實體框架4,WCF和Silverlight。用現有子項添加新對象導致重複
我有一個訂單到產品的多對多關係。
[Order]*--*[Product]
使用Model首先,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();
然而奇怪的事情發生了。保存時,數據庫中的幾乎所有內容都會被重複幾次。我的猜測是因爲實體框架幾次遍歷循環鏈接。
我試着將它改爲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();
沒有任何效果。訂單和產品表中的所有內容仍然是重複的 – 2011-04-28 13:36:08
我採納了您的建議,並對其進行了擴展。現在產品不重複,但表格中的所有訂單仍然是重複的。 db.Orders.AddObject(order); db.ObjectStateManager.ChangeObjectState(order,EntityState.Added); (product,order.Products) { db.ObjectStateManager.ChangeObjectState(product,EntityState.Unchanged); } db.SaveChanges(); – 2011-04-28 13:59:03
你是什麼意思的所有命令?你正在插入單個訂單,不是嗎? – 2011-04-28 14:08:09