Мое обновление Entity Framework вставляет новую строку вместо обновления той, которую я хочу, чтобы asp - PullRequest
0 голосов
/ 03 октября 2019

Я перебираю строки в таблице базы данных и обновляю баланс счета каждой строки, если она удовлетворяет требуемым условиям.

Вместо строки, которая удовлетворяет условию обновления в одиночку, она обновляетсяи одновременно с тем же запросом создается новая строка с обновленными значениями.

Я использую этот же код в том же приложении для изменения остатков на счетах в отдельных строках, и он отлично работает. Но когда я обращаюсь к нему из цикла foreach, возникает указанная выше проблема:

public bool CreditCustomerAccount(CustomerAccount account, decimal amount)
{
        try
        {
            if (account.Type == AccountType.Current || account.Type == AccountType.Savings)
            {
                account.AccountBalance += amount;
            }
            else
            {
                account.AccountBalance -= amount;
            }

            _context.Entry(account).State = EntityState.Modified;
            _context.SaveChanges();

            return true;
        }
        catch (Exception)
        {
            return false;
        }
}

Она обновляет соответствующую строку, но также создает новую запись таблицы базы данных с обновленными деталями

1 Ответ

0 голосов
/ 03 октября 2019

Когда вы публикуете сущность непосредственно обратно, контекст EF ничего не знает об этом. Проверьте метод Attach на DBSet. Из MS DOCS:

Присоединяет данный объект к контексту, лежащему в основе набора. Таким образом, объект помещается в контекст в неизмененном состоянии, как если бы он был считан из базы данных ... Присоединение используется для повторного заполнения контекста объектом, который, как известно, уже существует в базе данных.

Поэтому SaveChanges не будет пытаться вставить присоединенную сущность в базу данных, поскольку предполагается, что она уже существует.

Поэтому использование Attach перед изменением любых свойств позволит контексту «знать»об объекте, и любые изменения будут означать, что объект изменен.

...