如何正确更新实体列表?

时间:2013-04-05 13:56:57

标签: entity-framework

我想使用EF4更新实体列表。

  1. 我有一个ViewModel对象(从网络表单中检索)传递给名为“ 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;
                    }
                }
            }
    

3 个答案:

答案 0 :(得分:2)

您可能想要使用以下模式

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

这可以防止加载(选择)到数据库的行程,但是:

  • 由于没有加载,您无法确定数据库中是否存在该ID,因此您可能一个插入例外,以尝试更新不存在的行。
  • 由于没有发生负载,您无法检查标签修改情况,并且可能会使用相同的值进行更新。

答案 1 :(得分: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;
}

答案 2 :(得分: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()将抛出异常。