尝试查找记录时出现System.ArgumentException

时间:2016-12-15 13:57:39

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

我正在使用MVC.Net Framework和Entity Framework为作业制作“在线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,这些用户ID由相关的View Model传递。问题似乎出现在这行代码中:

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

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

更新问题:

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在你的情况下 -

AccTransfer is string

但由于它是一个帐号,我认为在数据库中你必须提到它作为前一个语句的整数 -

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

绝对正常。

答案 2 :(得分:0)

原因可能是AccTransfer不是主要的,或者AccTransfer是空的,或者找不到与AccTransfer相对应的记录,或者你可以使用ctx.AtmAccounts.SingleOrDefault(o => o.TransferAccount == AccTransfer)