【问题标题】:System.ArgumentException when trying to find a record尝试查找记录时出现 System.ArgumentException
【发布时间】:2016-12-15 13:57:38
【问题描述】:

我正在使用 MVC.Net 框架和实体框架为作业制作“在线 ATM”。我遇到的问题如下: 我的系统的功能之一是允许用户从一个帐户转移到另一个帐户。下面是这个动作的 Post 方法:

 [HttpPost]
    public ActionResult Transfer(decimal TransferAmount, string AccTransfer, string accId, int id)
    {

        using (var ctx = new BankDBEntities())
        {


            AtmAccount acc = ctx.AtmAccounts.Find(id);

            if (ctx.AtmAccounts.Any(o => o.AccountNumber.Equals(AccTransfer)))
            {

                AtmAccount trans = ctx.AtmAccounts.Find(AccTransfer);

                if (acc.AccountBalance >= TransferAmount)
                {

                    acc.AccountBalance = acc.AccountBalance - TransferAmount;
                    trans.AccountBalance = trans.AccountBalance - TransferAmount;
                    ctx.Entry(acc).State = System.Data.Entity.EntityState.Modified;
                    ctx.SaveChanges();
                    ctx.Entry(trans).State = System.Data.Entity.EntityState.Modified;
                    ctx.SaveChanges();

                    return RedirectToAction("Index");
                }

                else
                {
                    return RedirectToAction("Transfer");
                }

            }
            else
            {
                return RedirectToAction("Transfer");
            }

        }

此方法获取 TransferAmount 和 AccTransfer(要转移到的帐户),以及进行转移的用户的帐户 ID 和用户 ID,它们由关联的视图模型传递。问题似乎出在这行代码中:

AtmAccount trans = ctx.AtmAccounts.Find(AccTransfer);

此时,我收到一个 System.ArgumentException,内容为“主键值之一的类型与实体中定义的类型不匹配。有关详细信息,请参阅内部异常。”我一辈子都无法弄清楚如何解决这个问题。

问题更新:

在解决了上述问题后,我现在遇到了一个问题,即 trans 实体由于某种原因在尝试在表中找到 AccTransfer 后为空,该表肯定存在。

【问题讨论】:

  • AccTransfer 是一个字符串。它需要像您之前的电话一样是 int 。试试 AtmAccount trans = ctx.AtmAccounts.Find(Int32.Parse(AccTransfer));
  • 好的,很好,解决了这个问题。现在,无论出于何种原因,我的“trans”实体似乎为空,即使 AccTransfer 肯定存在于 AtmAccounts 中。

标签: c# asp.net-mvc entity-framework model-view-controller


【解决方案1】:

看来,是类型不匹配的问题。可能是因为这个类的主键属性的数据类型——AccTransfer 与实际实体对象的主键的数据类型不匹配或不同。

【讨论】:

  • 这似乎是问题所在。但是,AccTransfer 正在查找 Account Number 字段,而不是表的 Id 字段。在将 AccTransfer 更改为 int 而不是字符串之后,我现在遇到的问题是 trans 似乎返回为 null。不幸的是,将 AtmAccounts 表中的帐号更改为 int 会导致控制器出现其他问题。
【解决方案2】:

.net 中变量的数据类型和数据库中相应列的数据类型应该匹配。

在你的情况下 -

AccTransfer is string

但是既然是账号,我想你在数据库里肯定像前面的语句一样提到过它是一个整数-

AtmAccount acc = ctx.AtmAccounts.Find(id);

工作得很好。

【讨论】:

    【解决方案3】:

    原因可能是AccTransfer不是primary或​​者AccTransfer为null或者找不到AccTransfer对应的记录,也可以使用ctx.AtmAccounts.SingleOrDefault(o=>o.TransferAccount== AccTransfer)

    【讨论】:

    • 我已经检查过了,AccTransfer 在我的测试中是 125468,这是 AtmAccounts 表中记录的帐号。 AccTransfer 永远不会为空,但由于某种原因,trans 在表中找不到 AccTransfer。我是否需要将帐号作为主键才能执行此操作?
    • 是 Find() 需要一个主键,或者你可以使用 ctx.AtmAccounts.SingleOrDefault(o=>o.TransferAccount== AccTransfer)
    • 这正是我需要的答案,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多