【问题标题】:ASP.NET Core SaveChangesAsync does not save everythingASP.NET Core SaveChangesAsync 不会保存所有内容
【发布时间】:2020-05-30 11:43:29
【问题描述】:

问题:

如果我将 SaveChangesAsync 放在循环之外,它只会更改与 _context.Add(attdef); 一起放置的最后一个数据

为什么会这样?

起初我以为是因为我有autoIncrement,但是当我禁用它时,它仍然不起作用。

使用 SaveChanges 代替 SaveChangesAsync 也不能解决问题。

但更新数据效果很好。

GameController.cs

for (int i = 0; i < editViewModel.TowerAttack.Count; i++) 
{
    tower = _context.Tower.First(m => m.TowerId == editViewModel.TowerId[i]);
    tower.Attack -= editViewModel.TowerAttack[i];
    _context.Update(tower);
    attdef.Id = 0; // AutoIncrement
    attdef.Amount = attackSum;
    _context.Add(attdef);
}

await _context.SaveChangesAsync(); 

【问题讨论】:

    标签: c# asp.net database entity-framework linq


    【解决方案1】:

    attdef 是否在循环外声明?您是否只是在每个循环中更新同一个对象?如果是这种情况,我希望只添加该对象的最新版本。

    如果您尝试添加多个新对象,请尝试在循环中声明 attdef,以便每次都使用新对象。

    【讨论】:

      【解决方案2】:

      我认为您已经在上面某处声明了 attdef 变量,并且在循环中您正在更新相同的引用并将其添加到上下文中。因此,您在上下文中添加了单个项目。更好的方法是这样做

      var attdefs = new List<Attdef>();
      for (int i = 0; i < editViewModel.TowerAttack.Count; i++) 
                  {
                      tower = _context.Tower.First(m => m.TowerId == editViewModel.TowerId[i]);
                      tower.Attack -= editViewModel.TowerAttack[i];
                      _context.Update(tower);
                      attdefs.Add(new AttacDef { id = 0, Amount = attackSum }) ;
                  }
                    _context.AddRange(attdefs); // don't remember exaxct syntaxt but this should be faster way
                    await _context.SaveChangesAsync(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 2021-08-09
        • 2012-01-01
        • 2020-01-12
        • 1970-01-01
        相关资源
        最近更新 更多