【问题标题】:My Entity Framework update is inserting a new row instead of updating the one I want it to asp我的实体框架更新是插入一个新行而不是更新我想要它的那一行
【发布时间】:2019-10-03 20:30:28
【问题描述】:

我正在遍历数据库表中的行,如果满足要求的条件,则更新每行的帐户余额。

满足条件的行不再单独更新,而是更新,并且在同一查询中同时创建具有更新值的新行。

我在同一个应用程序中使用相同的代码来更改单行的帐户余额,并且效果很好。但是当我从 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;
        }
}

它会更新有问题的行,但也会使用更新的详细信息创建一个新的数据库表条目

【问题讨论】:

  • 尝试调试,看看主键(账号id)为空还是和id一样?
  • 你一定忘记把[key]属性放到模型里了。
  • Kevin Wong,它有钥匙。相关条目得到更新。问题只是添加了相同详细信息的新条目。这使得资产负债表无法加起来
  • 我加了罗斯

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

当您直接返回一个实体时,EF 上下文对此一无所知。查看 DBSet 上的 Attach method。来自 MS DOCS:

将给定实体附加到该集合的上下文中。那是, 实体以 Unchanged 状态放置到上下文中,就像 如果它已从数据库中读取... Attach 用于重新填充 具有已知已存在于 数据库。

因此,SaveChanges 不会尝试插入附加的实体 进入数据库,因为假定它已经存在。

因此,在修改任何属性之前使用 Attach 将使上​​下文“了解”对象,然后任何更改都表明对象已被修改。

【讨论】:

  • context.CustomerAccounts.Attach(account);
  • 那也没用。我只需要对同一个文件进行扣除,它就可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多