2013-04-05 82 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()将抛出异常。