ASP. NET Core SaveChangesAsyn c не все сохраняет - PullRequest
0 голосов
/ 14 февраля 2020

ПРОБЛЕМА:

Если я поместил SaveChangesAsyn c вне l oop, он изменит только последние данные, которые были добавлены с _context.Add(attdef);

Почему это так?

Сначала я подумал, что это потому, что у меня есть автоинкремент, но когда я его отключил, он все равно не работал.

Использование SaveChanges вместо SaveChangesAsyn c не исправляет проблема также.

Но обновление данных работает хорошо.

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(); 

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Объявляется ли attdef вне l oop? Вы просто обновляете один и тот же объект с каждым l oop? Я ожидаю, что в этом случае будет добавлена ​​только последняя версия этого объекта.

Если вы пытаетесь добавить несколько новых объектов, попробуйте объявить attdef в l oop, чтобы вы работали с каждый раз новый объект.

0 голосов
/ 14 февраля 2020

Я думаю, что вы объявили переменную attdef где-то выше, а в l oop вы обновляете ту же ссылку и добавляете ее в контекст. Благодаря этому у вас есть отдельный элемент, добавляемый в контекст. Лучший способ сделать это примерно так:

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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...