【问题标题】:Error while adding multiple items to an entity向实体添加多个项目时出错
【发布时间】:2016-11-30 06:38:10
【问题描述】:
for (int i = 0; i < skus.Count; i++)
{
    sku item = new sku();
    item = skus[i];
    sku sku = CompanyDbContext.skus.Where(s => s.item_no == item.item_no).FirstOrDefault();

    if (sku == null) // ok to insert [no duplicate item numbers]
    {
        CompanyDbContext.skus.Add(item);                             
    }

}
CompanyDbContext.SaveChanges();

我来了

集合被修改枚举操作可能无法执行

错误。我该如何解决这个问题?

【问题讨论】:

  • 似乎是一个重复的问题。见这里stackoverflow.com/questions/604831/… 和这里stackoverflow.com/questions/2024179/…
  • 这对我不起作用。所以我问了一个新的
  • 嗯,你基本上是在修改你正在迭代的东西。也许一个解决方案是创建一个临时列表变量,您可以在其中添加所有可以插入的项目,然后当您循环完成时一次性将它们全部添加?
  • 我也试过那个东西.. 使用 CompanyDbContext.skus.AddRange(skuListAdd);但这给了我同样的结果
  • 循环定义中的“skus”是什么?

标签: asp.net-mvc linq entity-framework-6


【解决方案1】:

正如 cmets 中所述,发生这种情况是因为您在执行工作时正在修改循环通过的集合。

您可以选择创建一个临时集合并将您的sku 项目添加到其中,最后将临时List&lt;sku&gt; 的内容添加到您的CompanyDbContext

// Create a new temporary list
List<sku> tempSkus = new List<sku>();
for (int i = 0; i < skus.Count; i++)
{
    // Let's assign item to skus[i] immediately, we don't need a new instance here when we're later re-pointing to an existing instance
    sku item = skus[i];

    // Use LINQ Any function to determine whether there are any existing SKU's already
    bool existingSku = CompanyDbContext.skus.Any(s => s.item_no == item.item_no);

    // There are no duplicates, let's add this sku item to our temporary List
    if(!existingSku) 
    {
        tempSkus.Add(item);
    }
}
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();

或者如果你更喜欢 LINQ

// Create a new temporary list
List<sku> tempSkus = skus.Where(p => CompanyDbContext.skus.Any(s => s.item_no != p.item_no)).ToList();
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();

【讨论】:

    【解决方案2】:

    问题在于您正在修改您正在迭代的相同内容。作为最佳实践,您应该像这样更新您的方法:

    //get search predicat from List<sku> skus
    var item_nos = skus.Select(s=>s.item_no).ToList();
    //items already in repo
    var addedItems = CompanyDbContext.skus.Where(s => item_nos.Contains(s.item_no)).ToList();
    var newItems = skus.Except(addedItems).ToList();
    foreach(var sku in newItems){
        CompanyDbContext.skus.Add(item);  
    }
    CompanyDbContext.SaveChanges();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-25
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多