Entity framework 如何正确更新实体列表?

Entity framework 如何正确更新实体列表?,entity-framework,Entity Framework,我想使用EF4更新实体列表 我将一个ViewModel对象(从web表单检索)传递给名为“productToUpdate”的方法,该方法包含一个“标签”列表 我通过对名为“requeteValsLabels”的匿名对象的Linq查询,从数据库中获取相应的对象列表 我手动完成了以下操作(在foreach循环中测试id),但我认为这不是最好的方法 for (int i = 0; i < productToUpdate.Labels.Count; i++) {

我想使用EF4更新实体列表

  • 我将一个ViewModel对象(从web表单检索)传递给名为“productToUpdate”的方法,该方法包含一个“标签”列表
  • 我通过对名为“requeteValsLabels”的匿名对象的Linq查询,从数据库中获取相应的对象列表 我手动完成了以下操作(在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;
                    }
                }
            }
    
    for(int i=0;i

  • 我认为更有效的方法是加入集合,然后复制值:

    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;
    }
    

    您可能需要使用以下模式

            foreach (var item in productToUpdate.Labels) {
                Entity e = new Entity { Id = item.IdValeurLabel};
                context.EntitySet.Attach(e);
                e.Valeur = item.Valeur;
            }
    
    这将防止加载(选择)数据库,但:

    • 由于没有发生加载,您无法确定该ID是否存在于数据库中,因此您可能有一个insert a异常,用于尝试更新不存在的行
    • 由于未加载,因此无法检查标签修改,可能会使用相同的值进行更新

    您的外环正确吗?应该是吗

    for (int i = 0; i < requeteValsLabels.Count; i++)
    
    for(int i=0;i
    你在寻找一种更简洁的方式来写这个吗?请尝试以下操作:

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

    不过要小心。。如果没有满足条件的元素,First()将抛出异常。

    谢谢,这就是我一直在寻找的