2010-03-28 38 views
2

我試圖插入幾個新創建的項目到數據庫。 我有一個名爲「Order」的LINQ2SQL生成的類。LINQ to SQL - 插入產生奇怪的行爲

內部訂單中有一個名爲「OrderItems」的屬性,它也由LINQ2SQL生成並表示該訂單的項目。

到目前爲止這麼好。 我現在遇到的問題是,當我嘗試在Order內添加多個新創建的OrderItem時。

即:

Order o = orderWorker.GetById(10); 
for(int i=0; i < 5; ++i) { 
    OrderItem oi =new OrderItem { 
       Order = o, 
       Price = 100, 
       ShippingPrice = 100, 
       ShippingMethod = ..., 
       Item = someItem 
      }; 
    o.OrderItems.Add(oi); 
} 

context.SubmitChanges(); 

不幸的是,被添加僅單個實體。 是的,我通過添加Context.Log = Console.Out來檢查生成的SQL,是的,只創建了一條語句。

任何線索? 當我知道我沒有使用InsertOnSubmit,通過文件的方式說:

您可以明確要求通過 插入使用InsertOnSubmit。或者, LINQ to SQL可以通過 推斷插入連接到 之一的已知對象,該對象必須是 已更新。例如,如果你一個 未跟蹤對象到 EntitySet的(TEntity)已或設置 的EntityRef(TEntity)已添加到未跟蹤 對象,則使未跟蹤對象 到達由在 圖表跟蹤對象的方法。在處理 SubmitChanges時,LINQ to SQL遍歷 跟蹤的對象並發現任何 未被跟蹤的可訪問持久對象 。這些對象是 候選人,用於插入 數據庫。

非常感謝您的時間。

回答

2

問題解決了,有點。

問題是我天真地實現了GetHashcode方法。 意思是,它爲已經創建的實體返回適當的哈希碼,但是對於新創建的實體(沒有分配的ID)它返回相同的哈希碼。

所以我禁用了我的實現等於& GetHashcode,它工作得很好。 謝謝你嘗試=)

+0

謝謝你喂回來 - 有趣。 – 2010-03-29 21:47:02

+0

這沒什麼意義......爲什麼我不能插入2個具有相同散列值並且比較等於的新對象? – 2016-06-06 16:09:32

0

這聽起來很瘋狂,但我想知道如果您刪除Order = o作業,並將其添加到OrderLines集合中,它是否會以不同的方式工作。試試看,至少。

+0

我試過你的建議,但它沒有奏效。 它仍然只添加一個項目。 那麼它有點讓我驚訝這種行爲。 我的意思是如果有什麼事情是非常錯誤的,沒有任何實體會被添加,但是添加單個實體會使我擔心。我相信這與LINQ2SQL將所有我創建的新實體作爲同一實體進行察覺的事實...很奇怪= \ – 2010-03-29 21:16:31