2013-04-05 61 views
1

我想用EF4更新一個實體列表。如何正確更新實體列表?

  1. 我有一個視圖模型對象(從Web表單中獲取)傳遞給我命名爲「productToUpdate」包含列表「標籤」的方法。
  2. 我從一個LINQ查詢的數據庫對象的命名一個匿名對象對應列表「requeteValsLabels」 我這樣做手動(測試在foreach循環中的id)爲遵循,但我想這是不是最好的辦法嗎?

    for (int i = 0; i < productToUpdate.Labels.Count; i++) 
         { 
          foreach (var item in productToUpdate.Labels) 
          { 
           if (requeteValsLabels[i].ID == item.IdValeurLabel){ 
           requeteValsLabels[i].Valeur = item.Valeur; 
           } 
          } 
         } 
    

回答

2

您可能需要使用以下方式

 foreach (var item in productToUpdate.Labels) { 
      Entity e = new Entity { Id = item.IdValeurLabel}; 
      context.EntitySet.Attach(e); 
      e.Valeur = item.Valeur; 
     } 

這阻止加載(選擇)到數據庫的行程,但是:

  • 當沒有負載發生時,您無法確定該ID是否存在於數據庫中,因此您可能有插入是嘗試更新不存在的行的例外。
  • 當空載發生時,您無法檢查標籤修改並可能使用相同的值進行更新。
+0

+1我喜歡存根實體的方法。 – 2013-04-05 14:16:00

+0

謝謝,這就是我一直在尋找 – Bro 2013-04-06 11:35:37

1

我認爲更有效的方式就是加入集合,然後複製值:

var query = from item in productToUpdate.Labels 
      join label in requeteValsLabels on item.IdValeurLabel equals label.ID 
      select new { item, label }; 

foreach (var pair in query.ToList()) 
{ 
    pair.label.Valuer = pair.item.Valuer; 
} 
0

你的外環是否正確?它應該是

for (int i = 0; i < requeteValsLabels.Count; i++) 

您是否正在尋找更緊湊的方式來編寫它?請嘗試以下操作:

for (int i = 0; i < requeteValsLabels.Count; i++) 
{ 
    requeteValsLabels[i].Valeur = productToUpdate.Labels 
     .First(x => x.IdValeurLabel == requeteValsLabels[i].ID).Valeur; 
} 

小心雖然如果沒有滿足條件的元素,First()將拋出異常。